Java 7 WatchService - 忽略相同事件的多次出现
Java 7 WatchService - 忽略相同事件的多次出现
StandardWatchEventKinds.ENTRY_MODIFY
的javadoc说:
目录条目被修改。当一个目录被注册到这个事件时,当观察到目录中的条目被修改时,WatchKey将被放入队列中。该事件的计数为1或更多。
当你通过编辑器编辑文件内容时,它会同时修改日期(或其他元数据)和内容。因此,你会得到两个ENTRY_MODIFY
事件,但是每个事件的count
都为1(至少我是这样看到的)。
我正在尝试监控一个通过命令行vi
手动更新的配置文件(之前使用WatchService
注册过的servers.cfg
文件),代码如下:
while(true) { watchKey = watchService.take(); // 阻塞 for (WatchEvent> event : watchKey.pollEvents()) { WatchEventwatchEvent = (WatchEvent ) event; WatchEvent.Kind kind = watchEvent.kind(); System.out.println(watchEvent.context() + ", count: "+ watchEvent.count() + ", event: "+ watchEvent.kind()); // 打印结果(在while循环中执行两次): // servers.cfg, count: 1, event: ENTRY_MODIFY // servers.cfg, count: 1, event: ENTRY_MODIFY switch(kind.name()) { case "ENTRY_MODIFY": handleModify(watchEvent.context()); // 重新加载配置文件 break; case "ENTRY_DELETE": handleDelete(watchEvent.context()); // 执行其他操作 break; } } watchKey.reset(); }
由于会得到两个ENTRY_MODIFY
事件,上述代码会在只需要一次的情况下重新加载配置两次。有没有办法忽略除了一个以外的所有事件,假设可能会有多个这样的事件?
如果WatchService
API有这样的工具就更好了。(我不太想在每个事件之间检查时间戳。我的代码中的所有处理方法都是同步的)
如果从一个目录复制/粘贴文件到被监视的目录中,会出现相同的情况。如何将这两个事件合并成一个事件?