- 所有超级接口:
-
AutoCloseable
,Closeable
通过调用其register
方法,将Watchable
对象注册到观察服务,返回一个WatchKey
来表示注册。当检测到对象的事件时,键被标记,如果当前未标记,则将其排队到观察服务,以便可以通过调用poll
或take
方法的消费者检索键并处理事件。一旦事件被处理,消费者调用键的reset
方法来重置键,这允许键被标记并重新排队以获取更多事件。
通过调用键的cancel
方法来取消与观察服务的注册。在取消时排队的键将保留在队列中,直到被检索。根据对象的不同,键可能会被自动取消。例如,假设监视一个目录,观察服务检测到该目录已被删除或其文件系统不再可访问。以这种方式取消键时,如果当前未标记,则将其标记并排队。为确保通知消费者,reset
方法的返回值指示键是否有效。
观察服务可安全地供多个并发消费者使用。为确保只有一个消费者在任何时间处理特定对象的事件,应注意确保只有在处理完其事件后才调用键的reset
方法。可以随时调用close
方法来关闭服务,导致任何等待检索键的线程抛出 ClosedWatchServiceException
。
文件系统可能比检索或处理事件更快地报告事件,实现可能对其积累的事件数量施加未指定的限制。如果实现明知丢弃事件,则它会安排键的pollEvents
方法返回一个事件类型为OVERFLOW
的元素。消费者可以使用此事件作为重新检查对象状态的触发器。
当报告事件指示监视目录中的文件已被修改时,不能保证修改文件的程序(或程序)已完成。应注意与可能正在更新文件的其他程序协调访问。FileChannel
类定义了锁定文件区域以防其他程序访问的方法。
平台依赖性
观察来自文件系统的事件的实现旨在直接映射到本机文件事件通知设施(如果可用),或者在本机设施不可用时使用原始机制,例如轮询。因此,关于如何检测事件、它们的及时性以及它们的顺序是否保留的许多细节高度依赖于实现。例如,当监视目录中的文件被修改时,在某些实现中可能会导致单个ENTRY_MODIFY
事件,而在其他实现中可能会导致多个事件。短暂存在的文件(意味着文件在创建后很快被删除)可能不会被定期轮询文件系统以检测更改的原始实现检测到。
如果监视的文件不位于本地存储设备上,则更改文件是否可以被检测是实现特定的。特别是,不要求检测对远程系统上执行的文件更改。
- 自版本:
- 1.7
- 参见:
-
Method Summary
-
Method Details
-
close
关闭此观察服务。如果线程当前在
take
或poll
方法中阻塞,等待键排队,则立即接收到一个ClosedWatchServiceException
。与此观察服务关联的任何有效键都将被无效化
。关闭观察服务后,任何进一步尝试对其执行操作都将抛出
ClosedWatchServiceException
。如果此观察服务已关闭,则调用此方法不会产生任何效果。- 指定者:
-
close
在接口AutoCloseable
- 指定者:
-
close
在接口Closeable
- 抛出:
-
IOException
- 如果发生 I/O 错误
-
poll
WatchKey poll()检索并移除下一个观察键,如果没有则返回null
。- 返回:
-
下一个观察键,或
null
- 抛出:
-
ClosedWatchServiceException
- 如果此观察服务已关闭
-
poll
检索并移除下一个观察键,如果没有则等待指定的等待时间。- 参数:
-
timeout
- 等待放弃的时间长度,以unit
为单位 -
unit
- 一个TimeUnit
,用于解释超时参数 - 返回:
-
下一个观察键,或
null
- 抛出:
-
ClosedWatchServiceException
- 如果此观察服务已关闭,或者在等待下一个键时关闭 -
InterruptedException
- 如果在等待时被中断
-
take
检索并移除下一个观察键,如果没有则等待。- 返回:
- 下一个观察键
- 抛出:
-
ClosedWatchServiceException
- 如果此观察服务已关闭,或者在等待下一个键时关闭 -
InterruptedException
- 如果在等待时被中断
-