WatchService被多次激发(MODIFY被激发,甚至在CREATE完成之前)JAVA



我有一个服务,它检查文件夹中的ZIP文件

while(true) {
WatchKey wk = watchService.take();
for (WatchEvent<?> event : wk.pollEvents()) {
Kind<?> eventKind = event.kind();
Path dir = (Path)wk.watchable();
Path eventPath = (Path) event.context();
Path fullPath = dir.resolve(eventPath);
fireAction(eventKind, fullPath);   
}
wk.reset();
}

这里,如果你看到,每次执行一个操作fireAction((方法被调用,下面是方法

public void fireAction(Kind<?> eventKind, Path eventPath) {

synchronized (listeners) {
if (eventKind == StandardWatchEventKinds.ENTRY_MODIFY) {

fileModified(this, eventPath);

} else if (eventKind == StandardWatchEventKinds.ENTRY_DELETE) {
fileDeleted(this, eventPath);

} else if (eventKind == StandardWatchEventKinds.ENTRY_CREATE) {
fileCreated(this, eventPath);
}
}
}

因此,当文件夹为空,并且我第一次将ZIP保存在文件夹中时,会调用fileCreate((方法,但它没有完成,fileModify((方法会被触发,fileModify((会被触发2次。当我从文件夹中删除ZIP时,它可以正常工作,但当我再次保留ZIP时,也可以正常工作。

所以只有第一次出现问题。请提出任何建议,这就是我尝试过的

  1. 在take((和pollEvents((之间执行Thread.sleep(3000(,在循环外部
  2. 使用.lastModified((查看文件是否已更新,但我不确定是否正确,还有其他方法吗?请建议

为您正在创建的文件生成校验和,并将校验和存储在值中,并将key设置为映射中文件的路径,当触发修改时,只需验证校验和和和文件,

如果校验和存在,不要修改,否则修改。

应该很容易实现,我也这么做了。

相关内容

  • 没有找到相关文章

最新更新