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

如何在磁盘上存储文件并保证在Java中删除它们,java,file,unix,Java,File,Unix,我需要存储用户上传的文件。我被指示将其存储在磁盘上(而不是尝试使用数据库blob或缓存系统之类的花哨方法) 但从那以后,我需要弄清楚如何确保文件最终被删除(可能是在最后一次访问文件一小时后)。这是在Linux服务器上。那么,确保文件被删除的最佳方法是什么呢?最简单的方法是定期检查上传目录并删除所有超过一小时的文件 如果您这样做,您就不必担心在服务器重新启动时跟踪文件之类的事情 可能是这样的: File uploads = new File("/tmp/uploads"); FileFilte

我需要存储用户上传的文件。我被指示将其存储在磁盘上(而不是尝试使用数据库blob或缓存系统之类的花哨方法)


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

最简单的方法是定期检查上传目录并删除所有超过一小时的文件

如果您这样做,您就不必担心在服务器重新启动时跟踪文件之类的事情

可能是这样的:

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();
}
File uploads=新文件(“/tmp/uploads”);
FileFilter hourOld=newfilefilter(){
@凌驾
公共布尔接受(文件){
返回文件.lastModified()

您可以使用。

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


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

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

  • 您可以使用
    find$path-daystart-mtime+1-execrm“{}”运行cron作业-删除前一天创建的所有文件

  • 无论何时上传文件,您都可以在Java中列出文件夹并删除所有太旧的文件

  • 你可以添加到你的应用程序中来组合这两个选项


因为您使用的是Linux,所以文件锁定不会成为问题。您始终可以在Linux上删除文件,即使进程仍在使用它们(只要进程使用它,Linux就会保留该文件,并在以后将其删除)。

我更喜欢使用cron4j,您可以在这里找到示例。

该程序就是为了执行这项任务而设计的。请注意,如果使用noatime选项装入文件系统,它将无法正常工作。

您可以使用临时文件。您可以定义是否应在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;
} 
然而,没有强有力的保证,因为只有在定期终止时,删除才会成功