无法删除文件,因为它正在使用中

时间:2013-08-06 15:39:15

标签: java file stream delete-file

我将首先发布代码,然后详细说明:

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());
    }
}

我正在尝试获取xml文件并根据xsd架构对其进行验证。如果验证失败,我想删除包含xml文件的文件夹。验证失败时,我无法删除该文件夹,因为web.xml仍在使用中。我在验证失败后尝试将Source设置为null,但web.xml仍然在使用中。任何想法如何解锁文件,以便我可以删除它?附注:如果验证成功,则删除文件夹也会成功。

2 个答案:

答案 0 :(得分: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。 [/编辑]

答案 1 :(得分: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;
    }
}