繁体   English   中英

在启动时删除临时文件

[英]Delete temp files on startup

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

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

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

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

并在开始时删除目录内容:

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

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

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

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

所以我有以下建议:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM