【问题标题】:Temporary File not deleted on close关闭时未删除临时文件
【发布时间】:2016-02-23 14:12:33
【问题描述】:

我在一个非常大的应用程序中使用Java,有时我必须使用临时文件。我想在应用程序关闭时删除那些文件,这是我正在使用的简单快照:

File tempFile = File.createTempFile("sign_", "tmp.pdf");
tempFile.deleteOnExit();

我没有报告所有代码,因为它真的很大,而且我有很多班级互相工作。我会知道这可能是避免在关闭某些文件时删除的原因(某些文件被删除而其他文件没有被删除,但它们总是来自同一段代码,即未被删除的代码)。

编辑:我已经阅读了this example,但我认为我需要一些“理论”动机而不是代码示例来找到原因。

【问题讨论】:

标签: java file-io io java-io


【解决方案1】:

“deleteOnExit()”方法仅在 VM 正常终止时有效。如果 VM 崩溃或强制终止,该文件可能会保持未删除状态。

我不知道它是如何实现的,但是您可以尝试将 tempFile.deleteOnExit() 放在 finally 中。

File tempFile = null; 
try{            
    tempFile = File.createTempFile("sign_", "tmp.pdf");

}catch(IOException e){          
    e.printStackTrace();            
} finally {
    if (tempFile != null) {
        tempFile.deleteOnExit();
        tempFile = null;
        //Added a call to suggest the Garbage Collector
        //To collect the reference and remove
        System.gc(); 
    }
}

或者,关闭所有对文件的引用,然后调用“File.delete()”立即删除。

如果有人在工作,则可能存在对该文件的某些引用。这样,您可以尝试使用org.apache.commons.io.FileUtils强制删除文件。

示例org.apache.commons.io.FileUtils

File tempFile = null; 
try{            
    tempFile = File.createTempFile("sign_", "tmp.pdf");

}catch(IOException e){          
    e.printStackTrace();            
} finally {
    if (tempFile != null) {
        FileUtils.forceDelete(tempFile);
        System.out.println("File deleted");
    }
}

示例org.apache.commons.io.FileDeleteStrategy

File tempFile = null; 
try{            
    tempFile = File.createTempFile("sign_", "tmp.pdf");

}catch(IOException e){          
    e.printStackTrace();            
} finally {
    if (tempFile != null) {
        FileDeleteStrategy.FORCE.delete(tempFile);
        System.out.println("File deleted");
    }
}

【讨论】:

  • 我更新了答案,包括在设置 tempFile = null 后调用垃圾收集器以尝试收集参考。此外,还包括 2 种不同的强制删除方式
  • 使用这种方法我仍然有一个例外:无法删除文件:C:\Users\USERNAME\AppData\Local\Temp\tmp.pdf