2017-04-03 98 views
1

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

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

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

回答

0

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

并在启动删除目录内容:

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

你,依然可以自由删除在应用程序退出目录中的内容,但这样一来,即使在出口处的清理并没有正确地完成你确定在启动时有一个空的目录。

0

如果您需要依赖其他常见资源(如临时文件),让您的应用程序具有多个实例通常是一个坏主意。例如,如果您已经有两个应用程序实例,刚刚打开的第三个应用程序很难判断它是否是第三个应用程序,以及其他实例是否仍然存在。

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

所以,我有以下几点建议:

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

由于代码的设计方式,即使这是一个好主意,也不可能像在您建议的那样在不同的窗口中从同一进程运行多个实例。 – piegames

+0

@piegames正如我们已经讨论过的,在退出时没有可靠的方法来删除临时文件,所以我们必须在启动时删除。就我所知,拥有多个实例几乎会使这项工作无法完成。 – Tony

+0

该程序可以将时间戳放入临时目录中的文件中,并在后台线程中每分钟更新一次。如果时间戳早于〜5分钟,则该文件夹可能会被新实例删除。 – piegames