我有一个库,它在运行时在 java.io.tempdir 中创建一些临时文件。第一个问题是 linux/centos 是否会在打开时自动删除 /tmp 中的临时文件。希望不是!
第二个问题,我想确保在 JVM 退出或中止时自动清理我的临时文件。File.deleteOnExit 不是一个选项,因为通常当库的客户端关闭他的“流”时,我的临时文件会被删除。它们是非常短暂的文件,在正确使用的情况下,永远不会有任何混乱,但可能会出现崩溃和其他原因导致我的临时文件没有被删除。
第一个想法是,最好的方法是在 /tmp 中创建我自己唯一命名的文件夹(名称的随机部分),并在此文件夹中创建我的所有临时文件,而不是使用 File.createTempFile。然后我注册了一个关机钩子,并且知道我的 vm 实例使用的文件夹的路径,我在关机时迭代这个文件夹并删除其中的所有文件,然后删除该文件夹。
这似乎适用于 linux,基于您可以删除打开的文件这一事实,但我的库不能保证临时文件流的客户端在调用关闭挂钩之前将关闭所有流,依此类推windows 文件不会被删除。那是个问题。
此外,某些容器可能不允许关闭钩子,即使它们允许,也不能绝对保证调用了关闭钩子。
我希望有一些可靠的方法来清理我的库在启动时创建的垃圾,这样这种方法将适用于在同一台机器上运行的多个 JVM。