Интерфейс WatchService
- Все суперинтерфейсы:
AutoCloseable, Closeable
public interface WatchService extends Closeable
Объект Watchable регистрируется в службе наблюдения вызовом метода register, который возвращает WatchKey, представляющий регистрацию. При обнаружении события для объекта ключ активируется и, если он ещё не активирован, помещается в очередь службы наблюдения, чтобы его могли получить потребители, вызывающие методы poll или take для получения ключей и обработки событий. После обработки событий потребитель вызывает метод reset ключа, чтобы сбросить его и разрешить повторную активацию ключа и помещение его в очередь при поступлении новых событий.
Регистрация в службе наблюдения отменяется вызовом метода cancel ключа. Ключ, находящийся в очереди на момент отмены, остаётся в очереди до момента его извлечения. В зависимости от объекта ключ может быть отменён автоматически. Например, предположим, что ведётся наблюдение за каталогом и служба обнаруживает, что он был удалён или его файловая система стала недоступна. При такой отмене ключ активируется и помещается в очередь, если он ещё не активирован. Чтобы уведомить потребителя, возвращаемое значение метода reset указывает, является ли ключ действительным.
Службу наблюдения безопасно использовать нескольким одновременно работающим потребителям. Чтобы гарантировать, что события для определённого объекта в каждый момент времени обрабатывает только один потребитель, следует следить за тем, чтобы метод reset ключа вызывался только после обработки его событий. Метод close можно вызвать в любое время, чтобы закрыть службу; все потоки, ожидающие получения ключей, получат исключение
ClosedWatchServiceException.
Файловые системы могут сообщать о событиях быстрее, чем их удаётся получать или обрабатывать, и реализация может устанавливать неуказанный предел на количество накапливаемых событий. Если реализация заведомо отбрасывает события, она обеспечивает возврат методом pollEvents ключа элемента с типом события OVERFLOW. Потребитель может использовать это событие как сигнал для повторной проверки состояния объекта.
Если сообщается о событии, указывающем на изменение файла в отслеживаемом каталоге, это не гарантирует, что программа (или программы), изменившая файл, завершила работу. Следует координировать доступ с другими программами, которые могут обновлять файл. Класс FileChannel определяет методы блокировки областей файла от доступа других программ.
Зависимость от платформы
Реализация, отслеживающая события файловой системы, предназначена для непосредственного использования встроенного механизма уведомления о файловых событиях, если он доступен, либо для применения простого механизма, например опроса, если встроенный механизм недоступен. Поэтому многие детали обнаружения событий, своевременность их обнаружения и сохранение порядка событий в значительной степени зависят от реализации. Например, изменение файла в отслеживаемом каталоге в одних реализациях может привести к одному событию ENTRY_MODIFY, а в других — к нескольким событиям. Простые реализации, периодически опрашивающие файловую систему для обнаружения изменений, могут не обнаружить кратковременно существующие файлы (то есть файлы, которые удаляются вскоре после создания).
Если отслеживаемый файл находится не на локальном устройстве хранения данных, возможность обнаружения изменений файла зависит от реализации. В частности, обнаружение изменений файлов, выполненных в удалённых системах, не гарантируется.
- Примечание по реализации:
- Реализации
WatchServiceв JDK буферизуют до 512 ожидающих событий для каждого зарегистрированного наблюдаемого объекта. При превышении этого предела ожидающие события отбрасываются, а в очередь помещается специальное событиеOVERFLOW. Это специальное событие служит сигналом для повторной проверки состояния объекта, например для сканирования отслеживаемого каталога и получения обновлённого списка файлов в нём. Предел числа ожидающих событий можно изменить с установленного по умолчанию значения с помощью системного свойстваjdk.nio.file.WatchService.maxEventsPerPoll, задав ему значение, которое разбирается как положительное целое число. Это может быть полезно в средах с большим объёмом изменений, где отбрасывание событий имеет серьёзные последствия. - Начиная с версии:
- 1.7
- См. также:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
close() |
Закрывает эту службу наблюдения. |
WatchKey |
poll() |
Извлекает и удаляет следующий ключ наблюдения или null, если ключей нет. |
WatchKey |
poll |
Извлекает и удаляет следующий ключ наблюдения; если ключей пока нет, при необходимости ожидает в течение указанного времени. |
WatchKey |
take() |
Извлекает и удаляет следующий ключ наблюдения; если ключей пока нет, ожидает их появления. |
Подробное описание методов
close
void close() throws IOException
Если поток в данный момент заблокирован в методе take или poll в ожидании помещения ключа в очередь, он немедленно получает ClosedWatchServiceException. Все действительные ключи, связанные с этой службой наблюдения, становятся invalidated.
После закрытия службы наблюдения любая последующая попытка выполнить над ней операцию приведёт к выбрасыванию ClosedWatchServiceException. Если эта служба наблюдения уже закрыта, вызов данного метода не имеет эффекта.
- Определено в:
-
closeв интерфейсеAutoCloseable - Определено в:
-
closeв интерфейсеCloseable - Выбрасывает:
-
IOException— если происходит ошибка ввода-вывода
poll
WatchKey poll()
null, если ключей нет.- Возвращает:
- следующий ключ наблюдения или
null - Выбрасывает:
-
ClosedWatchServiceException— если эта служба наблюдения закрыта
poll
WatchKey poll(long timeout, TimeUnit unit) throws InterruptedException
- Параметры:
-
timeout— время ожидания до прекращения ожидания, в единицах, заданных параметром unit -
unit—TimeUnit, определяющий способ интерпретации параметра тайм-аута - Возвращает:
- следующий ключ наблюдения или
null - Выбрасывает:
-
ClosedWatchServiceException— если эта служба наблюдения закрыта или закрывается во время ожидания следующего ключа -
InterruptedException— если ожидание прервано
take
WatchKey take() throws InterruptedException
- Возвращает:
- следующий ключ наблюдения
- Выбрасывает:
-
ClosedWatchServiceException— если эта служба наблюдения закрыта или закрывается во время ожидания следующего ключа -
InterruptedException— если ожидание прервано
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/nio/file/WatchService.html