0

最初にコードを投稿してから、詳しく説明します。

public void createPackage(String uploadedZipLocation) throws BadException, IOException, SAXException {
    String extractedFolderPath = uploadedZipLocation.split("\\.zip")[0];
    File tempFolder = null;
    Source xml = null;
    try {
        xml = new StreamSource(extractedFolderPath + "/web.xml");
        validatePkgXml(xml, extractedFolderPath + "/web.xml");
        xml = null; 
    } catch (IOException e) {
        throw e;
    } catch (BadException bpe) {
        xml = null;
        tempFolder = new File(extractedFolderPath);
        FileUtils.deleteDirectory(tempFolder); // **** Can't delete the folder because it is in use.  web.xml is still being read in validatePkgXml I think
        throw bpe;
    }
}


private void validatePkgXml(Source xmlStream, String xmlPath) throws BadException, IOException, SAXException{
    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = schemaFactory.newSchema(new File("/C:/workspacesFresh2/web.xsd"));
    Validator validator = schema.newValidator();
    validator.setErrorHandler(new PackageXMLValidationErrorHandler());
    try {
      validator.validate(xmlStream);
      logger.info(xmlStream.getSystemId() + " is valid");
    } catch (SAXException e) {
      logger.error(xmlStream.getSystemId() + " is NOT valid");
      throw new BadException(xmlPath, e.getLocalizedMessage());
    }
}

xsdxml ファイルを取得し、スキーマに対して検証しようとしています。検証に失敗した場合は、xml ファイルを含むフォルダーを削除したいと考えています。検証が失敗すると、フォルダーweb.xmlがまだ使用されているため、フォルダーを削除できません。検証に失敗した後にSourceをに設定しようとしましたが、どういうわけかまだ使用されています。ファイルのロックを解除して削除できるようにする方法はありますか? 補足: 検証が成功すると、フォルダーの削除も成功します。nullweb.xml

4

2 に答える 2

2

フォルダーを削除する前に、InputStream を閉じる必要があります。

私はこのコードをテストしていませんが、次のようなアイデアが得られるはずです:

public void createPackage(String uploadedZipLocation) throws BadException, IOException, SAXException {
    String extractedFolderPath = uploadedZipLocation.split("\\.zip")[0];
    File tempFolder = null;
    StreamSource xml = null;
    FileInputStream file = null;

    try {
        file = new FileInputStream(extractedFolderPath + "/web.xml");
        xml = new StreamSource(file);
        validatePkgXml(xml, extractedFolderPath + "/web.xml");
        xml.getInputStream().close(); 
        //xml = null; 
    } catch (IOException e) {
        xml.getInputStream().close(); 
        throw e;
    } catch (BadException bpe) {
        //xml = null;
        xml.getInputStream().close(); 
        tempFolder = new File(extractedFolderPath);
        FileUtils.deleteDirectory(tempFolder); // **** Can't delete the folder because it is in use.  web.xml is still being read in validatePkgXml I think
        throw bpe;
    }
}

それがうまくいくことを願っています!幸運を!

[編集] ところで。OutOfMemoryExceptions と ConcurrentModificationExceptions の結果となるメモリ リークを避けるために、常に Files と Stream を閉じる必要があります。[/編集]

于 2013-08-06T15:51:33.343 に答える
2

試す

public void createPackage(String uploadedZipLocation) throws BadException, IOException, SAXException {
    String extractedFolderPath = uploadedZipLocation.split("\\.zip")[0];
    File tempFolder = null;
    FileInputStream file = null;
    Source xml = null;
    try {
        file = new FileInputStream(extractedFolderPath + "/web.xml");
        xml = new StreamSource(file);
        validatePkgXml(xml, extractedFolderPath + "/web.xml");
        xml = null; 
    } catch (IOException e) {
        throw e;
    } catch (BadException bpe) {
        file.close();
        tempFolder = new File(extractedFolderPath);
        FileUtils.deleteDirectory(tempFolder);
        throw bpe;
    }
}
于 2013-08-06T15:52:19.357 に答える