确保在JVM出口上删除文件

Ham*_*aya 6 java file java-io

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

Ilm*_*nen 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();
Run Code Online (Sandbox Code Playgroud)

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


Tim*_*der 5

按照Java语言规范的定义,将仅尝试正常终止虚拟机进行删除

否。请在下次启动时检查文件。