Да, существует несколько доступных слушателей для каталогов, но все они относительно сложны и в большинстве случаев используют потоки.
Несколько дней назад я закончил почти разгоряченную дискуссию с одним из наших инженеров о том, было ли допустимым создание нового потока (в веб-приложении) просто для мониторинга дерева каталогов. В конце концов я согласился с ним, но благодаря тому, что придумал что-то настолько быстрое, что иметь слушателя не нужно. Примечание: решение, описанное ниже, работает, только если вам не нужно знать , какой файл изменился, только тот файл a изменился.
Вы предоставляете следующему методу коллекцию файлов (например, полученную с помощью метода FileUtils.listFiles () Apache IO), и это возвращает хэш для коллекции. Если какой-либо файл добавлен, удален или дата его изменения изменилась, хэш изменится.
В моих тестах 50K-файлы занимали около 750 мс на коробке Linux с частотой 3 ГГц. Прикосновение к любому из файлов изменяет хеш. В моей собственной реализации я использую другой алгоритм хеширования (DJB), который немного быстрее, но в этом суть. Теперь мы просто храним хеш и проверяем каждый раз, как он довольно безболезненный, особенно для небольших коллекций файлов. Если что-то меняется, мы переиндексируем каталог. Сложность наблюдателя просто не стоила того в нашем приложении.
/**
* Provided a directory and a file extension, returns
* a hash using the Adler hash algorithm.
*
* @param files the Collection of Files to hash.
* @return a hash of the Collection.
*/
public static long getHash( Collection<File> files )
{
Adler32 adler = new Adler32();
StringBuilder sb = new StringBuilder();
for ( File f : files ) {
String s = f.getParent()+'/'+f.getName()+':'+String.valueOf(f.lastModified());
adler.reset();
adler.update(s.getBytes());
sb.append(adler.getValue()+' ');
}
adler.reset();
adler.update(sb.toString().getBytes());
return adler.getValue();
}
И да, есть возможности для улучшения (например, мы используем метод хеширования, а не вставляем его). Вышесказанное урезано от нашего реального кода, но должно дать вам хорошее представление о том, что мы сделали.