Различия между API Java WatchService и библиотекой монитора ввода-вывода Apache Commons

Различия между API Java WatchService и библиотекой монитора ввода-вывода Apache Commons

1. обзор

Задолго до того, как JavaWatchService API был выпущен в Java 7, библиотека Apache Commons IO Monitoring уже обращалась к тому же варианту использования для мониторинга местоположения файловой системы или каталога на предмет изменений.

В этой статье мы собираемся исследовать различия между двумя API.

2. Maven Зависимости

Чтобы использовать Apache Commons IO, вpom необходимо добавить следующую зависимость:


    commons-io
    commons-io
    2.5

И, конечно, служба часов является частью JDK, поэтому она не нуждается во внешней зависимости.

3. Сравнение характеристик

3.1. Обработка, управляемая событиями

APIWatchService управляется событиями изменения файловой системы, инициированными операционной системой. Такой подход избавляет приложение от повторного опроса файловой системы на предмет изменений.

С другой стороны, библиотека Apache Commons IO Monitor опрашивает расположение файловой системы с настраиваемым интервалом ожидания, вызывая методlistFiles() классаFile. При таком подходе расходуются циклы ЦП, особенно если никаких изменений не происходит.

3.2. Метод обратного вызова

APIWatchService не предоставляет методов обратного вызова. Вместо этого он предоставляет два типа методов опроса, чтобы проверить, доступны ли новые события изменения для обработки:

  1. Методы блокировки, такие какpoll() (с параметром тайм-аута) иtake()

  2. Неблокирующий метод вродеpoll() (без параметра тайм-аута)

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

Подробности и использование этих методов можно найти в нашей статьеhere.

Напротив, библиотека ввода-вывода Apache Commons предоставляет методы обратного вызова в интерфейсеFileAlterationListener, которые вызываются при обнаружении изменения в расположении файловой системы или каталога.

FileAlterationObserver observer = new FileAlterationObserver("pathToDir");
FileAlterationMonitor monitor = new FileAlterationMonitor(POLL_INTERVAL);
FileAlterationListener listener = new FileAlterationListenerAdaptor() {
    @Override
    public void onFileCreate(File file) {
        // code for processing creation event
    }

    @Override
    public void onFileDelete(File file) {
        // code for processing deletion event
    }

    @Override
    public void onFileChange(File file) {
        // code for processing change event
    }
};
observer.addListener(listener);
monitor.addObserver(observer);
monitor.start();

3.3. Переполнение события

APIWatchService управляется событиями операционной системы. Следовательно, существует вероятность переполнения буфера операционной системы, в котором хранятся события, если приложение не может обработать события достаточно быстро. В этом сценарии запускается событиеStandardWatchEventKinds.OVERFLOW, указывающее на то, что некоторые события потеряны или отброшены до того, как приложение сможет их прочитать.

Для этого требуется правильная обработка событияOVERFLOW в приложении, чтобы приложение могло обрабатывать любой внезапный всплеск событий изменения, который может вызвать событиеOVERFLOW.

Библиотека Commons IO, с другой стороны, не основана на событиях операционной системы и, следовательно, не вызывает вопросов о переполнении.

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

  1. Если в последнем опросе найдено новое имя файла, в слушателе вызываетсяonFileCreate()

  2. Если имя файла, найденное в предыдущем опросе, отсутствует в списке файлов, полученном в результате последнего опроса, на слушателе вызываетсяonFileDelete()

  3. Если совпадение найдено, файл проверяется на наличие изменений в атрибутах, таких как дата последнего изменения, длина и т. Д. Если обнаружено изменение, на слушателе вызываетсяonFileChange()

4. Заключение

В этой статье нам удалось выделить ключевые различия в двух API.

И, как всегда, полный исходный код примеров, использованных в этой статье, доступен вthe Github project.