javadoc 为StandardWatchEventKinds.ENTRY_MODIFY
says:
目录条目已修改。当为此注册目录时
事件,然后当观察到其中的条目时,WatchKey 将排队
该目录已被修改。该事件的事件计数为 1
或更大。
当您通过编辑器编辑文件的内容时,它将修改日期(或其他元数据)和内容。因此你得到两个ENTRY_MODIFY
事件,但每个都会有一个count
1(至少这是我所看到的)。
我正在尝试监视配置文件(servers.cfg
之前已注册WatchService
)手动更新(即通过命令行vi
)使用以下代码:
while(true) {
watchKey = watchService.take(); // blocks
for (WatchEvent<?> event : watchKey.pollEvents()) {
WatchEvent<Path> watchEvent = (WatchEvent<Path>) event;
WatchEvent.Kind<Path> kind = watchEvent.kind();
System.out.println(watchEvent.context() + ", count: "+ watchEvent.count() + ", event: "+ watchEvent.kind());
// prints (loop on the while twice)
// servers.cfg, count: 1, event: ENTRY_MODIFY
// servers.cfg, count: 1, event: ENTRY_MODIFY
switch(kind.name()) {
case "ENTRY_MODIFY":
handleModify(watchEvent.context()); // reload configuration class
break;
case "ENTRY_DELETE":
handleDelete(watchEvent.context()); // do something else
break;
}
}
watchKey.reset();
}
既然你得到了两个ENTRY_MODIFY
事件时,上面的代码会在只需要一次时重新加载配置两次。假设可能存在多个此类事件,是否有任何方法可以忽略除其中一个之外的所有事件?
If the WatchService
API 有这样的实用性就更好了。 (我有点不想检查每个事件之间的时间。我的代码中的所有处理程序方法都是同步的。
如果您从一个目录创建(复制/粘贴)文件到监视目录,也会发生同样的情况。如何将这两者结合到一个活动中?