Java max решение для кэширования файлов - PullRequest
2 голосов
/ 20 сентября 2010

Я пытаюсь записать много файлов в каталог, и когда каталог достигнет Х числа файлов, я хочу, чтобы файл с наименьшим последним доступом был удален перед записью нового файла.Я действительно не хочу накатывать свое собственное решение, потому что я представляю, что кто-то уже сделал это раньше.Существуют ли решения для этого?Обратите внимание, что это для приложения Windows.

Это связано с моим вопросом Java ehcache disk store , но я задаю этот вопрос отдельно, так как сейчас я сосредоточен на решении для кэширования файлов.

Спасибо, Джефф

Ответы [ 3 ]

0 голосов
/ 20 сентября 2010

Вы можете попробовать это перед созданием нового файла:

void deleteOldFiles(String dir, int maxFiles) {
    File fdir = new File(dir);
    while (true) {
        // Check number of files. Also do nothing if maxFiles == 0
        File[] files = fdir.listFiles();
        if (maxFiles == 0 || files.length < maxFiles)
            break;

        // Delete oldest
        File oldest = files[0];
        for (int i = 1; i < files.length; i++) {
            if (files[i].lastModified() < oldest.lastModified()) {
                oldest = files[i];
            }
        }
        oldest.delete();
    }
}

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

Хотя все это попадает в «катить мою собственную категорию» ...

0 голосов
/ 06 января 2012

Если вы используете Cacheonix, вы можете подключиться к API событий кэширования и удалить файлы при получении уведомления о том, что запись в кэше была удалена алгоритмом LRU.

0 голосов
/ 20 сентября 2010

Я бы выбрал свою собственную, потому что проблема звучит так легко, что написать ее самостоятельно, вероятно, проще, чем попытаться изучить и принять существующую библиотеку: -)

Если это небольшое количество файлов и / иливаши деньги доступны из нескольких процессов, перед записью файла вызовите следующий метод:

void deleteOldFiles(String dir, long maxFileCount) {
    while (true) {
        File oldest = null;
        long oldestTime = 0;
        File[] list = new File(dir).listFiles();
        if (list.length < maxFileCount) {
            break;
        }
        for (File f : list) {
            long m = f.lastModified();
            if (oldest == null || oldestTime > m) {
                oldestTime = m;
                oldest = f;
            }
        }
        oldest.delete();
    }
}

Если вы обращаетесь к кешу только из одного процесса, вы можете написать что-нибудь более эффективное, используя LinkedHashMap или LinkedHashSet.

Обновление

Проверьте количество файлов вместо общего размера файла.

...