我有一个服务,它检查文件夹中的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时,也可以正常工作。
所以只有第一次出现问题。请提出任何建议,这就是我尝试过的
- 在take((和pollEvents((之间执行Thread.sleep(3000(,在循环外部
- 使用.lastModified((查看文件是否已更新,但我不确定是否正确,还有其他方法吗?请建议
为您正在创建的文件生成校验和,并将校验和存储在值中,并将key设置为映射中文件的路径,当触发修改时,只需验证校验和和和文件,
如果校验和存在,不要修改,否则修改。
应该很容易实现,我也这么做了。