【问题标题】:deleteOnExit not deleting file despite closing of stream writing to it尽管关闭了写入文件的流,但 deleteOnExit 不删除文件
【发布时间】:2020-07-21 15:24:52
【问题描述】:

相关代码:

File tempFile = File.createTempFile("", "");
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
byte[] bytes = IOUtils.toByteArray(inputStream);
out.write(bytes);
out.close();

我通过 IntelliJ 将它作为本地 tomcat 服务器运行配置运行,并且在退出服务器时,它不会清理临时文件。关于我可能遗漏的任何想法?

【问题讨论】:

  • 你是否停止了应用服务器?
  • dan1st,是的。我什至退出了 IntelliJ 并确保没有运行杂散进程。

标签: java fileoutputstream


【解决方案1】:

File.deleteOnExit() 在当前 VM 上安装了一个关闭挂钩,因此只有在 VM 执行正常受控关闭时才会触发您的删除。

对于将通过 TOMCAT 安装中的 bin\shutdown.batbin/shutdown.sh 脚本的 TOMCAT。

但是,如果您的 TOMCAT 服务器可以运行 非常 很长时间,您应该避免完全调用 File.deleteOnExit(),因为要删除的文件存储在一个列表中,该列表可能(最终)增长到巨大的大小并且导致 OutOfMemoryError。

这对于频繁重启的 Tomcat 实例来说不是问题,但对于大容量应用服务器来说会是一个问题。如果需要这种不同的方法,在 try...finally 中跟踪准备删除的临时文件会更可靠:

File temp = null;
try {
    ...
    temp = File.createTempFile("", "") ...
    ...
} finally {
    deleteOnExit(temp);
}

private static void deleteOnExit(File fileToDelete)
{
    if (fileToDelete != null)
        fileToDelete.delete();
}

【讨论】:

  • 谢谢!我正在考虑使用 try-with-resources 块,试一试。
猜你喜欢
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 2013-05-07
  • 2019-02-04
  • 2021-07-08
相关资源
最近更新 更多