模块  java.base
软件包  java.nio.file

Interface WatchService

  • All Superinterfaces:
    AutoCloseableCloseable

    public interface WatchService
    extends Closeable
    手表服务, 手表已注册的对象的变化和事件。 例如,文件管理器可以使用监视服务来监视目录以进行更改,以便在创建或删除文件时它可以更新其文件列表的显示。

    通过调用其register方法向监视服务注册Watchable对象,返回WatchKey以表示注册。 当检测到对象的事件时,将发信号通知密钥,如果当前未发出信号,则将其排队到监视服务,以便调用polltake方法的消费者检索密钥并处理事件。 一旦处理了事件,消费者就会调用密钥的reset方法来重置密钥,该密钥允许密钥发出信号并随后用其他事件重新排队。

    通过调用密钥的cancel方法取消注册监视服务。 取消时排队的密钥将保留在队列中,直到被检索为止。 根据对象,可以自动取消密钥。 例如,假设监视目录并且监视服务检测到它已被删除或其文件系统不再可访问。 当以这种方式取消密钥时,如果当前未发出信号,则发信号通知并排队。 为了确保通知消费者, reset方法的返回值表明密钥是否有效。

    多个并发消费者可以安全地使用监视服务。 要确保只有一个使用者随时处理特定对象的事件,应注意确保仅在处理事件后调用该键的reset方法。 可以随时调用close方法来关闭服务,导致任何线程等待检索密钥,抛出ClosedWatchServiceException

    文件系统可以比检索或处理事件更快地报告事件,并且实现可以对其可能累积的事件的数量施加未指定的限制。 如果实现有意丢弃事件,则它会安排密钥的pollEvents方法返回事件类型为OVERFLOW的元素。 消费者可以将此事件用作重新检查对象状态的触发器。

    当报告事件以指示已监视目录中的文件已被修改时,则无法保证已修改该文件的程序(或多个程序)已完成。 应注意协调与可能正在更新文件的其他程序的访问。 FileChannel类定义了锁定文件区域以防其他程序访问的方法。

    平台依赖

    观察来自文件系统的事件的实现旨在直接映射到可用的本机文件事件通知工具,或者在本机工具不可用时使用原始机制(例如轮询)。 因此,关于如何检测事件,及时性以及是否保留其排序的许多细节都是高度特定于实现的。 例如,当修改监视目录中的文件时,可能会在某些实现中导致单个ENTRY_MODIFY事件,但在其他实现中会导致多个事件。 短期文件(意味着在创建后很快删除的文件)可能无法被定期轮询文件系统以检测更改的原始实现检测到。

    如果监视文件不在本地存储设备上,则如果可以检测到对文件的更改,则它是特定于实现的。 特别是,不需要检测对远程系统上执行的文件的更改。

    从以下版本开始:
    1.7
    另请参见:
    FileSystem.newWatchService()
    • 方法摘要

      所有方法  实例方法 抽象方法 
      变量和类型 方法 描述
      void close()
      关闭此手表服务。
      WatchKey poll()
      检索并删除下一个监视密钥,如果不存在,则检索并删除 null
      WatchKey poll​(long timeout, TimeUnit unit)
      检索并删除下一个监视密钥,必要时等待指定的等待时间(如果还没有)。
      WatchKey take()
      检索并删除下一个监视密钥,如果还没有,则等待。