3

我有一个库,它在运行时在 java.io.tempdir 中创建一些临时文件。第一个问题是 linux/centos 是否会在打开时自动删除 /tmp 中的临时文件。希望不是!

第二个问题,我想确保在 JVM 退出或中止时自动清理我的临时文件。File.deleteOnExit 不是一个选项,因为通常当库的客户端关闭他的“流”时,我的临时文件会被删除。它们是非常短暂的文件,在正确使用的情况下,永远不会有任何混乱,但可能会出现崩溃和其他原因导致我的临时文件没有被删除。

第一个想法是,最好的方法是在 /tmp 中创建我自己唯一命名的文件夹(名称的随机部分),并在此文件夹中创建我的所有临时文件,而不是使用 File.createTempFile。然后我注册了一个关机钩子,并且知道我的 vm 实例使用的文件夹的路径,我在关机时迭代这个文件夹并删除其中的所有文件,然后删除该文件夹。

这似乎适用于 linux,基于您可以删除打开的文件这一事实,但我的库不能保证临时文件流的客户端在调用关闭挂钩之前将关闭所有流,依此类推windows 文件不会被删除。那是个问题。

此外,某些容器可能不允许关闭钩子,即使它们允许,也不能绝对保证调用了关闭钩子。

我希望有一些可靠的方法来清理我的库在启动时创建的垃圾,这样这种方法将适用于在同一台机器上运行的多个 JVM。

4

2 回答 2

2

我有一个库,它在运行时在 java.io.tempdir 中创建一些临时文件。第一个问题是 linux/centos 是否会在打开时自动删除 /tmp 中的临时文件。希望不是!

这取决于是否有清理脚本正在运行。但是在 UN*X 机器上,这无关紧要,因为 JVM 将保存打开的文件描述符——这允许它被读/写,直到它被关闭。一旦关闭,文件系统将自动释放空间。

第二个问题,我想确保在 JVM 退出或中止时自动清理我的临时文件。File.deleteOnExit 不是一个选项,因为通常当库的客户端关闭他的“流”时,我的临时文件会被删除。它们是非常短暂的文件,在正确使用的情况下,永远不会有任何混乱,但可能会出现崩溃和其他原因导致我的临时文件没有被删除。

UN*X 服务器下的一个常见技巧是打开文件,然后使用 File.remove() 从文件系统中删除条目,同时仍然能够读取/写入它。如果JVM崩溃或正常退出,空间会自动释放,文件系统上没有垃圾临时文件。在 Windows 中,问题会更大一些,您可能需要实施定期扫描,尝试 File.remove() [忽略失败]。

于 2012-05-12T23:55:51.733 回答
0

是的,为临时文件创建临时文件夹是不错的选择,我认为这样做没有害处。您可以在库中构建自动删除例程以删除早于 x 天或小时的临时文件,并且您可以将此时间配置为用户指定此时间并创建默认值。

我也在 DataSynapse 服务器中看到了这种方法。

于 2012-05-12T17:02:32.230 回答