如何在磁盘上存储文件并保证它们在Java中被删除

时间:2012-03-15 13:57:53

标签: java file unix

我需要存储用户上传的文件。我被告知要将它存储在磁盘上(而不是尝试使用数据库blob或缓存系统)。

但是从那里开始,我需要弄清楚如何确保文件最终被删除(可能是上次访问后一小时)。这是在Linux服务器上。那么保证文件被删除的最佳方法是什么?

6 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点:

  • 您可以使用find $path -daystart -mtime +1 -exec rm "{}" \;运行cron作业 - 删除前一天创建的所有文件。

  • 每当上传文件时,您都可以在Java中列出该文件夹并删除所有过旧的文件

  • 您可以将Quartz添加到您的应用中,以合并这两个选项。

由于您使用的是Linux,因此文件锁定不会成为问题。你总是可以在Linux上删除文件,即使进程仍在使用它们(只要进程使用它就会保留文件,然后删除它)。

答案 1 :(得分:1)

最简单的方法是定期检查上传目录并删除每个超过一小时的文件的某个过程。

如果以这种方式执行此操作,则无需担心在服务器重新启动时跟踪文件等事项。

可能是这样的:

File uploads =  new File("/tmp/uploads");

FileFilter hourOld = new FileFilter() {
  @Override
  public boolean accept(File file) {
    return file.lastModified() < System.currentTimeMillis() - 60 * 60 * 1000;
  }
};

for (File file : uploads.listFiles(hourOld)) {
  file.delete();
}

您可以使用ScheduledExecutorService安排此操作。

答案 2 :(得分:1)

为了保证删除,我会运行一个单独的进程,该进程在启动时作为服务启动以删除文件。这样,即使您的程序没有运行,它们也会被删除。

通常,您需要确保在服务运行时删除文件。您只需确保文件已关闭,并且您有一个后台线程,它会定期检查上次访问的时间。

答案 3 :(得分:1)

答案 4 :(得分:1)

tmpwatch程序旨在执行此确切任务。请注意,如果您使用noatime选项安装了文件系统,它将无法正常工作。

答案 5 :(得分:1)

您可以使用临时文件。您可以定义是否应在VM终止时删除它们:

public static File createTempFile(String name, String suffix) {
    try {
        File temp = File.createTempFile(name, "." + suffix);

        temp.deleteOnExit();
        return temp;

    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
} 

然而,没有强有力的保证,因为删除只会在定期终止期间成功。