【问题标题】:Java file delete and System.gc()Java 文件删除和 System.gc()
【发布时间】:2012-02-22 16:23:34
【问题描述】:

在我的应用程序中,我正在编写一个文件来存储一些执行信息,一旦执行完成,我想删除临时文件。问题是即使在文件关闭或通过流刷新后我也无法删除文件。我试过了

Thread.sleep(1000);
file.delete();

这也没有删除文件。然后我创建了一个while循环

while(!file.delete())
   Thread.sleep(1000);

它一直在循环。然后我添加了

System.gc();
file.delete();

成功了!!!

我已确认我已正常关闭或刷新文件。我想知道为什么我的代码可以使用 System.gc()

【问题讨论】:

  • 在尝试删除文件之前,请确保您已关闭所有打开的文件流。
  • 这仍然是真的。这是一个与 Windows 相关的错误 JDK-4715154。可能这就是为什么 Scala 运行时库中有特殊的 scala.compat.Platform.collectGarbage() 条目。

标签: java file file-io delete-file


【解决方案1】:

这似乎表明你没有打电话给close()

原因:在java开始的时候,Object.finalize()方法被用来清理垃圾回收,而对于I/O它做了一个close()

在文件被使用(未关闭)之前,无法在 Windows 上删除该文件。

【讨论】:

    【解决方案2】:

    您要使用的是File.createTempFile() 并在结果文件上调用deleteOnExit()。它将在执行结束时为您管理清理临时文件。您不应该手动执行此操作,让系统为您执行此操作,这就是他们将其包含在标准库中的原因。

    此外,您应该始终调用.close() 以确保所有数据都已刷新到文件并且可以正确清理句柄。

    【讨论】:

    • File.createTempFile() 不做任何清理工作。它只是在临时目录中创建一个具有唯一名称的文件。完成后,应用程序仍应删除该文件。
    猜你喜欢
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多