在启动时删除临时文件

时间:2017-04-03 10:22:53

标签: java temp

我的程序需要一个临时文件夹才能在运行时输入数据。退出程序后不需要此数据,应删除。程序的每个运行实例都需要一个文件夹。

如果我使用file.deleteOnExit(),则无法确保文件在任何类型的崩溃时被删除。我的想法是检查启动时没有删除的旧临时文件并删除它们。但是当启动程序的另一个实例时,它不应该删除仍在运行的程序的临时文件。我怎样才能做到这一点?

更具体一点:临时文件应位于系统的临时目录中,如果程序正常退出,则应将其删除。这个问题只是程序崩溃的几次。该程序必须独立于操作系统。首选使用Path而不是File类的解决方案。

2 个答案:

答案 0 :(得分:0)

好吧,我建议在每个应用程序的开始时创建一个私有目录,其中存储临时文件说/var/run/myapp/tmp

开始时删除目录内容:

void purgeDirectory(File dir) {
    for (File file: dir.listFiles()) {
        if (file.isDirectory()) purgeDirectory(file);
        file.delete();
    }
}

您可以在应用程序退出时自由删除目录内容,但这样,即使在退出清理时未正确完成,您也确保在启动时有一个空目录。

答案 1 :(得分:0)

如果您需要依赖其他公共资源(如临时文件),通常让您的应用程序拥有多个实例是个坏主意。例如,如果您已经有两个应用程序实例,那么刚打开的第三个实例将很难判断它是否是第三个以及其他实例是否还活着。

正如您所说,如果JVM崩溃并且Java没有提供自动清理临时文件的可靠方法,deleteOnExit()将不会清除临时文件。

所以我有以下建议:

  • 如果您可以选择仅使用多个窗口创建一个应用程序实例:
    • 您可以拥有固定的位置并在启动时进行清理。但是,通过这种方式,您可能会放弃Java的一些可移植性。
    • 如果您的应用程序是GUI应用程序,您可以通过Java API创建临时文件并在关闭主框架时注册一些干净的操作,等等 - 仍然无法处理某些崩溃情况
    • 您可以添加shutdownHook - 仍然无法处理某些崩溃情况
  • 如果您坚持拥有多个实例并且您的应用程序是GUI应用程序:必须使用Java API来创建临时文件,并且可能添加侦听器或shutdownHook。