我有一个库,它在java.io.tempdir运行时会创建一些临时文件。第一个问题是linux / centos是否会在/ tmp打开时自动删除临时文件。希望不是!
第二个问题,我想确保在JVM退出或中止时自动清理我的临时文件。 File.deleteOnExit不是一个选项,因为通常我的临时文件会在库的客户端关闭他的“流”时被删除。它们是非常短暂的文件,在正确使用时,永远不会有任何混乱,但可能会出现崩溃和其他原因导致我的临时文件没有被删除。
第一个想法是,最好的方法是在/ tmp中创建我自己的唯一命名文件夹(名称的随机部分)并在此文件夹中创建我的所有临时文件,而不是使用File.createTempFile 。然后我注册一个关闭钩子,并知道我的vm实例使用的文件夹的路径,我在关机时迭代这个文件夹并删除其中的所有文件,然后删除该文件夹。
这似乎可以在Linux上运行,基于你可以删除打开文件的事实,但我的库无法保证临时文件流的客户端在关闭钩子被调用之前将关闭所有流,所以在Windows上不会删除文件。那是个问题。
此外,某些容器可能不允许关闭挂钩,即使它们这样做,也不能绝对保证调用关闭挂钩。
我希望有一种可靠的方法来清理我在启动时创建的库,这样这种方法可以在同一台机器上运行的几个JVM上运行。
答案 0 :(得分:2)
我有一个库,它在java.io.tempdir运行时会创建一些临时文件。第一个问题是linux / centos是否会在/ tmp打开时自动删除临时文件。希望不是!
这取决于是否有运行的清理脚本。但是在UN * X机器上,这并不重要,因为JVM将保存打开的文件描述符 - 这允许它在被关闭之前被读/写。一旦关闭,文件系统将自动释放空间。
第二个问题,我想确保在JVM退出或中止时自动清理我的临时文件。 File.deleteOnExit不是一个选项,因为通常我的临时文件会在库的客户端关闭他的“流”时被删除。它们是非常短暂的文件,在正确使用时,永远不会有任何混乱,但可能会出现崩溃和其他原因导致我的临时文件没有被删除。
UN * X服务器下的一个常见技巧是打开文件,然后使用File.remove()从文件系统中删除条目,同时仍然能够读/写它。如果JVM正常崩溃或退出,则会自动释放空间,并且文件系统上没有垃圾临时文件。对于Windows,它有点问题,您可能需要实现尝试File.remove()[忽略失败]的定期扫描。
答案 1 :(得分:0)
是的,为临时文件创建临时文件夹是不错的选择,我认为这样做没什么坏处。您可以在库中构建自动删除例程,以删除超过x天或小时的临时文件,并且可以将此时间配置为用户指定此时间并创建默认值。
我也在DataSynapse服务器中看到了这种方法。