我在一个非常大的应用程序中使用Java
,有时我必须使用临时文件。我希望在应用程序关闭时删除这些文件,这是我正在使用的简单快照:
File tempFile = File.createTempFile("sign_", "tmp.pdf");
tempFile.deleteOnExit();
我没有报告所有代码,因为它真的很大,我有很多班级互相工作。我知道哪些可能是避免删除某个文件的关闭的原因(某些文件被删除,其他文件没有被删除,但它们总是来自同一段代码而未被删除的文件。)
编辑:我已经阅读了this example但我认为我需要一些“理论”动机,而不是代码示例来找到原因。
答案 0 :(得分: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) {
FileUtils.forceDelete(tempFile);
System.out.println("File deleted");
}
}
或者,关闭对文件的所有引用,然后调用" 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) {
FileDeleteStrategy.FORCE.delete(tempFile);
System.out.println("File deleted");
}
}
示例 org.apache.commons.io.FileDeleteStrategy :
ps aux | grep foo.jar | grep -v grep | awk '{print $2}' | xargs kill