Module  java.base
软件包  java.nio.file

Interface WatchService

  • All Superinterfaces:
    AutoCloseableCloseable


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

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

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

    手表服务可以安全使用多个并发消费者。 为了确保只有一个消费者随时处理特定对象的事件,则应注意确保密钥的reset方法仅在其事件处理完毕后才被调用。 可以随时调用close方法关闭导致任何线程等待检索密钥的服务,以抛出ClosedWatchServiceException

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

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

    平台依赖

    从文件系统观察事件的实现旨在直接映射到可用的本机文件事件通知工具,或者在本机设备不可用时使用原始机制(如轮询)。 因此,关于如何检测事件,及时性以及是否保存其顺序的许多细节都是具体实现的。 例如,当观察目录中的文件被修改时,它可能导致一些实现中的单个ENTRY_MODIFY事件,而在其他实现中可能导致一些事件。 短期文件(意味着在创建后被非常快速地删除的文件)可能不会被定期轮询文件系统以检测更改的原始实现来检测。

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

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

      所有方法  接口方法  抽象方法 
      Modifier and Type 方法 描述
      void close​()
      关闭这个手表服务。
      WatchKey poll​()
      检索并删除下一个监视键,如果没有,则 null
      WatchKey poll​(long timeout, TimeUnit unit)
      检索并删除下一个watch键,如果还没有,则等待必要时直到指定的等待时间。
      WatchKey take​()
      检索并删除下一个Watch键,等待是否还没有。