Рубрики
Без рубрики

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

Основные отличия API WatchService от JDK и библиотеки мониторинга ввода-вывода Apache Commons для отслеживания изменений в файловой системе.

Автор оригинала: baeldung.

1. Обзор

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

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

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

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


    commons-io
    commons-io
    2.8.0

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

3. Сравнение функций

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

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

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

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

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

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

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

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

В отличие от этого, библиотека ввода-вывода 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. Переполнение событий

Служба наблюдения API управляется событиями операционной системы. Следовательно, существует вероятность того, что буфер операционной системы, в котором хранятся события, переполнится, если приложение не сможет обработать события достаточно быстро. В этом сценарии событие StandardWatchEventKinds.ПЕРЕПОЛНЕНИЕ запускается, указывая, что некоторые события были потеряны или отброшены до того, как приложение смогло их прочитать.

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

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

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

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

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

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

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