确保在JVM出口上删除文件

时间:2009-09-15 01:51:00

标签: java file java-io

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

2 个答案:

答案 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语言规范

所定义

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