确保在JVM出口上删除文件

File.deleteOnExit()是否保证即使JVM过早被杀死也会删除该文件?

将仅尝试删除虚拟机的正常终止,如Java语言规范所定义

如果可能,请在下次启动时检查文件。

正如Tim Bender所说, File.deleteOnExit()并不能保证文件实际被删除。

但是,在Unixish系统(例如Linux或OSX)上,可以写入之前删除临时文件(但在打开之后)。 只要你对文件保持一个开放的描述符,就可以继续读取和写入它,即使文件不再存在于目录树中,操作系统将自动回收文件使用的空间。程序退出(或关闭文件的最后一个描述符)。

这不适用于Windows,它具有不同的文件系统语义,不允许删除打开的文件。 但是,在便携式代码中,您只需在打开文件后尝试删除该文件,如果不成功,则返回deleteOnExit()

 File tempFile = File.createTempFile("tempfile", ".tmp"); RandomAccessFile fh = new RandomAccessFile (tempFile, "rw"); // try to delete the file now, fall back to deletion on exit if ( !tempFile.delete() ) tempFile.deleteOnExit(); 

请注意,显然, File.deleteOnExit()在Windows上不是很可靠。 因此,只要有可能,您应该尝试在完成后手动关闭和删除临时文件。 有关详细信息,请参阅我写给另一个问题的答案 。