WatchService 被多次触发(MODIFY 甚至在 CREATE 完成之前就被触发)JAVA
WatchService getting fired multiple times (MODIFY is fired and even before CREATE is finished) 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 时,它工作正常。
所以只有第一次出现问题。请提出任何建议,这是我尝试过的方法
- Thread.sleep(3000) 在 take() 和 pollEvents() 之间,在 for 循环之外。
- 使用 .lastModified() 查看文件是否更新,但我不确定是否正确,还有其他方法吗?请推荐
为您正在创建的文件生成校验和并将校验和存储在值中并将键设置为映射中文件的路径,当触发修改时,只需验证校验和和文件,
如果校验和存在,不修改,否则修改。
应该很容易实现,我也做了。
我有一项服务可以检查文件夹中的 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 时,它工作正常。
所以只有第一次出现问题。请提出任何建议,这是我尝试过的方法
- Thread.sleep(3000) 在 take() 和 pollEvents() 之间,在 for 循环之外。
- 使用 .lastModified() 查看文件是否更新,但我不确定是否正确,还有其他方法吗?请推荐
为您正在创建的文件生成校验和并将校验和存储在值中并将键设置为映射中文件的路径,当触发修改时,只需验证校验和和文件,
如果校验和存在,不修改,否则修改。
应该很容易实现,我也做了。