4

阅读 javadocs WatchEvent,我看到该count()方法让我知道事件是否被其结果重复。

返回事件计数。如果事件计数大于 1,则这是重复事件。

这到底是什么意思?这是否意味着两个或多个WatchEvent对象引用相同的“事件”(例如正在创建的文件)?

我正在Oracle 网站上试验新API 的示例WatchService,这部分让我很困惑,特别是因为我会在连续运行相同的测试代码时获得不同数量的事件(在其中我使用 a 写入文件FileWriter而不与手动),但结果count()永远不会超过 1。

编辑:我意识到这可能与关于重复事件的其他问题有关,但这并不能回答重复事件的实际含义。

4

2 回答 2

2

我花了一段时间对此进行试验,这是我的结论:

如果同一文件发生多个类型事件,则针对文件f和事件类型重复事件。eef

如果一个e类型事件发生在多个文件f1f2f3中,但每个文件只发生一次,则这些事件都不会重复。

当您.take()WatchKey中获取时WatchService,您将获得WatchEvent经历过事件的每个文件、经历过的每种事件类型的一个。如果自.count()上次WatchKeyWatchService.

也就是说,如果您正在观看其中包含的目录A.txt,那么会发生以下事件:

  1. B.txt在目录中创建。
  2. B.txt被写入。
  3. A.txt被写入。
  4. B.txt被删除。
  5. A.txt被再次写入。

你会得到四个WatchEvents

  1. 的创建事件B.txt
  2. 的修改事件B.txt
  3. 的修改事件A.txt。它将.count()是 2。
  4. 的删除事件B.txt

这意味着您永远不会3*n在您的 中获得更多的事件WatchKey,其中n是目录中任何时候的文件数。

中定义了四种类型的事件StandardWatchEventKinds,但OVERFLOW事件表明事件可能已经丢失,所以我从上面的数字中省略了它。

于 2014-02-28T15:32:09.603 回答
0

监视服务允许您为目录中的事件注册一个侦听器。如果一个事件在你的服务被通知之前发生了不止一次,它会得到一个增量,而不是有两个这样的事件导致通知。

这专门针对文件,因此它处理目录中的文件创建、修改、删除。

于 2014-02-24T21:30:37.307 回答