首页 文章

在启动时删除临时文件

提问于
浏览
1

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

如果我使用 file.deleteOnExit() ,这不能确保文件在任何类型的崩溃时被删除 . 因此我的想法是在启动时检查旧的临时文件,这些文件没有't got deleted and remove them. But when starting another instance of the program it shouldn' t删除仍在运行的程序的临时文件 . 我怎样才能做到这一点?

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

2 回答

  • 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 .

相关问题