技术开发 频道

Java7 NIO.2入门:文件系统API教程

  StandardWatchEventKind.ENTRY_CREATE 指出在所注册的 Path 中创建了文件或者目录。当文件重命名或者移入这一目录时,还触发了 ENTRY_CREATE 事件。

  StandardWatchEventKind.ENTRY_MODIFY 指出在所注册的 Path 中文件或者目录被修改。究竟是哪些事件组成了修改,在一定程度上是平台特定的,但是在这里只想说,其实对文件内容的修改总会触发一个修改事件。在一些平台中,变更文件的属性也会触发这一事件。

  StandardWatchEventKind.ENTRY_DELETE 指出在所注册的 Path 中删除了文件或者目录。当对文件重命名或者将文件移出目录时,也会触发 ENTRY_DELETE 事件。

  对于我们的例子,让我们监视 ENTRY_CREATE 和 ENTRY_MODIFY 事件,而不是 ENTRY_DELETE:

WatchKey watchKey = watchDirPath.register(watchService,
       StandardWatchEventKind.ENTRY_CREATE, StandardWatchEventKind.ENTRY_MODIFY);

  Path 现在注册为被监视,并且 WatchService 将总会一直在后台安静地工作,专心地监视目录。利用前面所展示的相同 Path 创建和 register() 调用,同一个 WatchService 实例能够监视多个目录。

  您可能已经发现 register() 方法调用返回了我们以前从未遇到过的类:WatchKey。该类代表注册到 WatchService。是否挂接到这个引用由您决定,因为触发事件后,WatchService 会返回相关的 WatchKey。然而,要注意不存在方法调用用来找出 WatchKey 注册到哪个 目录,因此如果正在监视多个目录,您可能想要追踪哪个 WatchKey 与哪个 Path 相关。当您 在处理特定 WatchKey 及其所注册的事件时,可以很简单地通过调用 cancel() 方法,来取消其在 WatchService 的注册。

  现在已注册了 Path,我们可以用很方便的方式来检查 WatchService,看是否发生了任何我们感兴趣的事件。WatchService 提供三个方法来检查是否有任何令人激动的事发生。

  如果有相关事件出现,WatchKey poll() 会返回下一个 WatchKey,或者没有注册的事件发生,会返回 null。

  WatchKey poll(long timeout, TimeUnit unit) 需要超时和时间单元(java.util.concurrent.TimeUnit)。如果在特定时间范围内,有任何事件发生,这一方法存在,会返回相应的 WatchKey。如果在超时时间结束时,没有 WatchKeys 返回,这一方法将会返回 null。

  WatchKey take() 与前面的方法相似,不同之处是,它将无限期等待,直到可以返回 WatchKey。

  一旦这三个方法之一返回了 WatchKey,它将不会再被 poll() 或者 take() 调用返回,直到其 reset() 方法被调用。一旦 WatchService 返回了 WatchKey,就可以检查由于调用了 WatchKey 的 pollEvents() 方法而触发的事件,其将返回一列 WatchEvent。

  为了便于说明,清单 3 中的简单示例仍然是来自我们前面注册的 WatchKey :

0
相关文章