Как хранить файлы на диске и гарантировать, что они будут удалены в Java - PullRequest
0 голосов
/ 15 марта 2012

Мне нужно хранить файлы, которые загружает пользователь.Меня проинструктировали, что я должен хранить его на диске (и не пытаться делать что-либо необычное, например, использование больших двоичных объектов базы данных или системы кэширования)

Но оттуда мне нужно выяснить, как убедиться, что файлы в конечном итоге будут удалены (возможно, через час после их последнего доступа).Это на сервере Linux.Итак, каков наилучший способ гарантировать удаление файлов?

Ответы [ 6 ]

2 голосов
/ 15 марта 2012

Есть много способов сделать это:

  • Вы можете запустить задание cron с помощью find $path -daystart -mtime +1 -exec rm "{}" \; - удаляет все файлы, созданные днем ​​ранее.

  • Всякий раз, когда файл загружен, вы можете перечислить папку на Java и удалить все файлы, которые являются слишком старыми

  • Вы можете добавить Кварц в свое приложение, чтобы объединить два варианта.

Поскольку вы работаете в Linux, блокировка файлов не будет проблемой. Вы всегда можете удалить файлы в Linux, даже если процесс все еще использует их (Linux будет хранить файл в течение всего времени, пока процесс использует его, и впоследствии будет удалять его).

1 голос
/ 15 марта 2012

Вы можете использовать временные файлы. Вы можете определить, будут ли они удалены после завершения работы виртуальной машины:

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;
} 

Однако нет никаких гарантий, так как удаление будет успешным только во время обычного завершения.

1 голос
/ 15 марта 2012

Программа tmpwatch предназначена для выполнения именно этой задачи.Обратите внимание, что он не сможет работать правильно, если у вас установлена ​​файловая система с опцией noatime.

1 голос
/ 15 марта 2012

Я бы предпочел использовать cron4j, вы можете найти примеры здесь http://www.sauronsoftware.it/projects/cron4j/manual.php?PHPSESSID=oakn2j011nkoeoqv791pfcs4q3

1 голос
/ 15 марта 2012

Чтобы гарантировать удаление, я запускаю отдельный процесс, который запускается как служба при запуске для удаления файлов. Таким образом, они будут удалены, даже если ваша программа не запущена.

Как правило, все, что вам нужно для обеспечения удаления файлов при запуске службы. Вам просто нужно убедиться, что файл закрыт, и у вас есть фоновый поток, который периодически проверяет время последнего обращения.

1 голос
/ 15 марта 2012

Самый простой способ - это какой-то процесс, который периодически проверяет каталог загрузки и удаляет каждый файл, возраст которого превышает час.

Если вы делаете это таким образом, вам не нужно беспокоиться о таких вещах, какотслеживание файлов при перезапуске сервера.

Может быть что-то вроде этого:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...