Как создать монитор для определенного каталога?

Используя Java поверх Windows Vista, я пытаюсь создать своего рода монитор для каталога, поэтому каждый раз, когда этот каталог изменяется (новые, переименованные, обновленные или удаленные файлы), запускается процесс. Я попытался сделать это с помощью цикла, который будет выполнять dir в каталоге и анализировать все файлы. Но это занимает очень много времени и памяти, особенно когда количество файлов начинает расти. Я думаю, что должен быть лучший способ сделать это.

примечание: для этого в SO есть похожий вопрос, но он для С#.


person Paulo Guedes    schedule 09.10.2009    source источник


Ответы (4)


Если вы не можете дождаться Java 7 и WatchService, вы придется сделать что-то вроде этого:

final File watched = new File("[path of directory to watch]");
long lastModified = watched.lastModified();
while(true) {
    if (watched.lastModified() > lastModified) {
        // Change happened in the directory do what you want.
    }
    Thread.sleep(2000); // 2 second interval
}
person Ben S    schedule 09.10.2009
comment
Ваше решение выглядит лучше, чем то, которое я использую сейчас. Попробую, пока Java 7 не со мной. - person Paulo Guedes; 09.10.2009
comment
Вам придется обрабатывать некоторые возможные исключения, возникающие в моем коде. Thread.sleep() и операция ввода-вывода может вызывать исключения. - person Ben S; 09.10.2009
comment
Мне самому нравится TimeUnit.SECONDS.sleep(2) - person Droo; 10.10.2009
comment
вы должны установить lastMofidied = watch.lastModified также внутри оператора if, иначе оператор всегда будет истинным после первого изменения - person Martin Dürrmeier; 10.11.2009
comment
@MartinDürrmeier Согласен, это ошибка, люди должны быть осторожны с этим кодом. - person HXCaine; 16.08.2012

Я думаю, что должен быть лучший способ сделать это.

Вы правы, должен быть лучший способ, и он появится в Java 7. См. предстоящий API WatchService.

Без сборки RC я не знаю, есть ли переносной способ сделать то, что вы описываете.

person Kevin    schedule 09.10.2009

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

Таким образом, я ожидал бы хранить Map имен файлов по сравнению с временем модификации (по крайней мере, для проверки).

К сожалению, не существует простого способа использовать Java для проверки каталога на наличие изменений, кроме опроса каталога в той или иной степени. См. 1096876">мой предыдущий ответ wrt. этот вопрос и библиотеки, которые вы можете использовать, чтобы упростить это (плюс функция Java 7)

person Brian Agnew    schedule 09.10.2009

Вам, вероятно, потребуется использовать JNI для вызова ReadDirectoryChangesW. Вместо этого вы можете использовать FirstFirstChangeNotification и FindNextChangeNotification, но если вам не нужна совместимость со старыми (16-разрядными) версиями Windows, я бы не советовал этого делать.

person Jerry Coffin    schedule 09.10.2009