File.deleteOnExit() 是否保证即使 JVM 过早地被杀死,文件也会被删除?
问问题
4217 次
2 回答
7
正如 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 上不是很可靠。因此,只要有可能,您仍应在完成临时文件后尝试手动关闭和删除它们。有关更多详细信息,请参阅我写给另一个问题的这个答案。
于 2013-05-22T15:02:34.487 回答
5
按照 Java 语言规范的定义,仅在虚拟机正常终止时才会尝试删除
否。如果可能,请在下次启动时检查文件。
于 2009-09-15T01:58:00.970 回答