Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java—清理spring/tomcat/jboss库中临时文件的正确方法_Java_Spring_Tomcat_Jboss_Shutdown - Fatal编程技术网

java—清理spring/tomcat/jboss库中临时文件的正确方法

java—清理spring/tomcat/jboss库中临时文件的正确方法,java,spring,tomcat,jboss,shutdown,Java,Spring,Tomcat,Jboss,Shutdown,我有一个库,可以在java.io.tempdir运行时在其中创建一些临时文件。第一个问题是linux/centos是否会在/tmp中打开临时文件时自动删除该文件。希望不是 第二个问题,我想确保在JVM退出或中止时自动清理我的临时文件。File.deleteOnExit不是一个选项,因为通常当库的客户端关闭其“流”时,我的临时文件会被删除。它们是非常短暂的文件,在正确使用时,不会有任何混乱,但可能会有崩溃和其他原因导致我的临时文件未被删除 第一个想法是,最好的方法是在/tmp中创建我自己唯一命名的

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

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

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

这在linux上似乎是可行的,因为您可以删除打开的文件,但我的库不能保证临时文件流的客户端在调用关闭挂钩之前关闭了所有流,因此在windows上不会删除文件。这是个问题

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


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

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

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

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

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

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

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