尽管关闭了写入文件的流,deleteOnExit 仍未删除文件

deleteOnExit not deleting file despite closing of stream writing to it

相关代码:

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

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

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

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

但是,如果您的 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();
}