代码之家  ›  专栏  ›  技术社区  ›  Hamza Yerlikaya

确保在jvm退出时删除文件

  •  6
  • Hamza Yerlikaya  · 技术社区  · 15 年前

    file.deleteonexit()是否保证即使过早地终止了JVM,也会删除该文件?

    2 回复  |  直到 9 年前
        1
  •  4
  •   Tim Bender    15 年前

    只有在Java语言规范定义的虚拟机的正常终止时,才会尝试删除。

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

        2
  •  6
  •   Community CDub    7 年前

    正如蒂姆·本德所说, File.deleteOnExit() 不保证文件被删除。

    但是,在Unixish系统(如Linux或OSX)上,可以删除临时文件 之前 写信给它(但在打开之后)。只要对文件保留一个打开的描述符,就可以继续对其进行读写操作,即使该文件不再存在于目录树中,并且当程序退出(或关闭文件的最后一个描述符)时,操作系统将自动回收该文件使用的空间。

    这在Windows上不起作用,因为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();
    

    注意,显然, 文件.deleteonexit() 在窗户上不太可靠。因此,在可能的情况下,在处理完临时文件后,仍然应该尝试手动关闭和删除它们。有关详细信息,请参阅 this answer I wrote to another question .