确保文件在JVM退出时被删除

6
File.deleteOnExit()方法是否保证在JVM被异常终止的情况下也能删除文件?
2个回答

7
如Tim Bender所指出的那样,File.deleteOnExit()不能保证文件被删除。
然而,在类Unix系统(如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();

请注意,显然,在Windows上,File.deleteOnExit()不是非常可靠的。因此,尽可能在使用完临时文件后手动关闭和删除它们。有关更多详细信息,请参见我写给另一个问题的答案

这太棒了。 - alex

5

只有遵循Java语言规范所定义的正常终止虚拟机的情况下,才会尝试删除。

如果可能的话,下次启动时检查文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接