【问题标题】:What does it mean for an event to be "repeated?"一个事件被“重复”是什么意思?
【发布时间】:2014-02-24 20:48:04
【问题描述】:

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

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

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

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

编辑:我意识到这可能与this other question about repeated events 有关,但这并不能回答重复事件的实际含义。

【问题讨论】:

  • 会不会是双击的意思?
  • @DavidWallace 我不知道,你告诉我。我什至没有点击有问题的文件,所以我不知道。
  • 我从来没有使用过这个类——但是如果你正在监视在目录中创建的文件,然后在目录中创建一个文件,然后在目录中创建另一个文件,也许这是一个重复的事件?
  • @ajb 我当然希望不是这样,因为那么检查 count 是否大于 1 有什么意义呢?为了确定,我每次都必须检查事件上下文。

标签: java events watchservice


【解决方案1】:

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

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

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

当您从WatchService.take()WatchKey 时,您将获得一个WatchEvent,每个文件都经历了一个事件,对于它经历的每种事件类型。如果自您上次从 WatchService 获得 WatchKey 以来,该文件多次发生此类事件,则 .count() 将大于 1。

也就是说,如果您正在观看一个包含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 的删除事件。

这意味着在您的WatchKey 中,您永远不会得到超过3*n 的事件,其中n 是该目录中任意时刻的文件数。

StandardWatchEventKinds中定义了四种类型的事件,但是OVERFLOW事件表示事件可能已经丢失,所以我在上面的编号中省略了。

【讨论】:

  • 如果您所做的只是在收到修改事件时读取文件内容,这是否意味着您可以忽略重复/重复事件?作为文件的内容,在您处理事件时才是最重要的,您似乎无法在第一次重复事件时获得内容?
【解决方案2】:

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

这是专门关于文件的,所以它处理目录中的文件创建、修改、删除。

【讨论】:

  • 您能解释一下“事件发生不止一次”是什么意思吗?假设我在WatchService 注意到之前修改了目录中的两个文件,我会从key.pollEvents() 收到两个修改事件还是会收到一个计数为 2 的修改事件?
  • 我看文档的方式,你监控一个目录;如果在 WatchService 开始构建通知之前修改了两个文件,您将收到一个通知,说明发生了两个事件。
  • 你这是什么意思?我只修改了一个文件,所以我修改了我的测试代码来修改两个文件,我得到了两个修改事件。在从WatchService 获取事件之前,我添加了 1 秒的wait,我得到了两个修改事件,每个事件的计数为 2(可能与链接问题中的原因相同。)这是否意味着 @ 987654325@ 是指特定类型的事件发生在该目录中的特定文件上的次数?例如如果文件A.txt被多次写入,带有context()A.txt的修改事件的count会大于1?
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2011-01-09
  • 2010-11-05
  • 1970-01-01
相关资源
最近更新 更多