方法“deleteOnExit()”只适用于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()”来立即删除。
如果有人正在工作,可能存在对文件的某些引用。这样,你可以尝试force使用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");
}
}
[“删除将仅尝试用于正常终止虚拟机,如Java Language Specification所定义。“](https://docs.oracle.com/javase/7/docs/api/java/io/File.html#deleteOnExit())是JVM退出异常? –
如果这是你的真实代码,你不需要设置tmp.deleteOnExit();到tempFile.deleteOnExit()? – Alex
@AlexClem我从另一段代码复制而来,你是对的!我在编辑 – Razlo3p