File.deleteOnExit()是否保证即使JVM过早被杀死也会删除该文件?
答案 0 :(得分:6)
正如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上不太可靠。因此,只要有可能,您应该尝试在完成后手动关闭和删除临时文件。有关详细信息,请参阅this answer I wrote to another question。
答案 1 :(得分:5)
只会尝试删除虚拟机的正常终止,如Java语言规范
所定义
没有。如果可能,请在下次启动时检查文件。