Module java.base
Package java.nio.file

Interface WatchService

所有超级接口:
AutoCloseable, Closeable

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

通过调用其register方法,将Watchable对象注册到观察服务,返回一个WatchKey来表示注册。当检测到对象的事件时,键被标记,如果当前未标记,则将其排队到观察服务,以便可以通过调用polltake方法的消费者检索键并处理事件。一旦事件被处理,消费者调用键的reset方法来重置键,这允许键被标记并重新排队以获取更多事件。

通过调用键的cancel方法来取消与观察服务的注册。在取消时排队的键将保留在队列中,直到被检索。根据对象的不同,键可能会被自动取消。例如,假设监视一个目录,观察服务检测到该目录已被删除或其文件系统不再可访问。以这种方式取消键时,如果当前未标记,则将其标记并排队。为确保通知消费者,reset方法的返回值指示键是否有效。

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

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

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

平台依赖性

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

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

自版本:
1.7
参见:
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    close()
    关闭此观察服务。
    poll()
    检索并移除下一个观察键,如果没有则返回null
    poll(long timeout, TimeUnit unit)
    检索并移除下一个观察键,如果没有则等待指定的等待时间。
    take()
    检索并移除下一个观察键,如果没有则等待。