Интерфейс WatchService
- Все суперинтерфейсы:
-
AutoCloseable,Closeable
public interface WatchService extends Closeable
Объект Watchable регистрируется в службе наблюдения путём вызова его метода register, возвращающего WatchKey для представления регистрации. При обнаружении события для объекта ключ сигнализируется, и если он в данный момент не сигнализирован, он помещается в очередь службы наблюдения, чтобы его могли получить потребители, которые вызывают методы poll или take для получения ключей и обработки событий. После обработки событий потребитель вызывает метод ключа reset для сброса ключа, что позволяет ключу сигнализироваться и повторно помещаться в очередь с последующими событиями.
Регистрация в службе наблюдения отменяется путём вызова метода ключа cancel. Ключ, помещённый в очередь в момент отмены, остаётся в очереди до тех пор, пока он не будет получен. В зависимости от объекта, ключ может быть отменён автоматически. Например, если наблюдается каталог, и служба наблюдения обнаруживает, что он удалён или его файловая система больше недоступна. При отмене ключа таким образом он сигнализируется и помещается в очередь, если в данный момент не сигнализирован. Для обеспечения уведомления потребителя возвращаемое значение из метода reset указывает, является ли ключ действительным.
Служба наблюдения безопасна для использования несколькими одновременными потребителями. Чтобы гарантировать, что только один потребитель обрабатывает события для определённого объекта в любое время, следует позаботиться о том, чтобы метод ключа reset вызывался только после обработки его событий. Метод close может быть вызван в любое время для закрытия службы, вызывая у нитей, ожидающих получения ключей, выбрасывание
ClosedWatchServiceException.
Файловые системы могут сообщать о событиях быстрее, чем они могут быть получены или обработаны, и реализация может ограничить неопределённым образом количество событий, которые могут накапливаться. Там, где реализация намеренно отбрасывает события, она организует возврат метода ключа pollEvents с элементом типа события OVERFLOW. Это событие может использоваться потребителем как триггер для повторного анализа состояния объекта.
Когда событие сообщает о том, что файл в наблюдаемом каталоге был изменён, нет гарантии, что программа (или программы), которые изменили файл, завершили свою работу. Следует позаботиться о координации доступа с другими программами, которые могут обновлять файл. Класс FileChannel определяет методы для блокировки областей файла от доступа другими программами.
Зависимости от платформы
Реализация, которая наблюдает за событиями файловой системы, предназначена для прямого отображения на собственный механизм уведомления о событиях файлов, где это возможно, или для использования примитивного механизма, такого как опросный режим, когда собственный механизм недоступен. Поэтому многие детали того, как события обнаруживаются, их своевременность и сохранение их порядка сильно зависят от конкретной реализации. Например, когда файл в наблюдаемом каталоге изменяется, это может привести к одному событию ENTRY_MODIFY в некоторых реализациях, но к нескольким событиям в других реализациях. Кратковременные файлы (т.е. файлы, которые удаляются очень быстро после создания) могут не обнаруживаться примитивными реализациями, которые периодически опрашивают файловую систему на предмет изменений.
Если наблюдаемый файл не находится на локальном накопителе, то то, будут ли обнаружены изменения в файле, зависит от конкретной реализации. В частности, не требуется, чтобы изменения файлов, выполненные на удалённых системах, обнаруживались.
- Примечание по реализации:
- Реализации JDK
WatchServiceбуферизуют до 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- единица измерения, определяющая, как интерпретировать параметр time-out - Возвращает:
- следующий ключ наблюдения или
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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/nio/file/WatchService.html