我注意到使用java.nio.file.WatchService时出现了奇怪的行为(不确定这是否是预期行为)。
问题在于我已经注册了一个带有WatchService的文件夹。 当我将新文件复制到此文件夹中时,会生成两个WatchEvent事件,分别是:
'ENTRY_CREATE'和'ENTRY_MODIFY'。
据我所知,新文件(从未被监视的其他目录中复制)只能创建一个事件,即:'ENTRY_CREATE'。
有人可以解释一下为什么会产生额外的 'ENTRY_MODIFY' 事件吗?
我的代码:
当我复制一个文件,比如说名字是"abc.txt",日志会显示:
新文件 abc.txt
文件已修改.... abc.txt
问题在于我已经注册了一个带有WatchService的文件夹。 当我将新文件复制到此文件夹中时,会生成两个WatchEvent事件,分别是:
'ENTRY_CREATE'和'ENTRY_MODIFY'。
据我所知,新文件(从未被监视的其他目录中复制)只能创建一个事件,即:'ENTRY_CREATE'。
有人可以解释一下为什么会产生额外的 'ENTRY_MODIFY' 事件吗?
我的代码:
public void watch() {
WatchKey key = watcher.poll();
//log.info("Watcher scheduler running. Watch key {}", key.hashCode());
if (key != null) {
Workflow workflow = keys.get(key);
log.info("Runing watcher for key '{}' and workflow {}", key.hashCode(), workflow.getName());
File hotFolder = new File(workflow.getFolderPath());
Path dir = hotFolder.toPath();
for (WatchEvent<?> event : key.pollEvents()) {
WatchEvent<Path> ev = cast(event);
Path name = ev.context();
Path child = dir.resolve(name);
log.info("Polling event for name {} and child {} and dir {}", name.toFile(), child.toFile(), dir.toFile());
if (Files.isDirectory(child, LinkOption.NOFOLLOW_LINKS))
continue;
try {
switch (event.kind().name()) {
case "ENTRY_CREATE":
log.info("New file {}", child.toFile());
fileService.processNewFile(child.toFile(), workflow);
break;
case "ENTRY_MODIFY":
log.info("File modified.... {}", child.toFile());
fileService.processModifiedFile(child.toFile(),
workflow);
break;
default:
log.error("Unknown event {} for file {}", event.kind()
.name(), child.toFile());
break;
}
// Operation op = Operation.from(event.kind());
// if (op != null)
// publisher.publishEvent(new FileEvent(child.toFile(),
// workflow, op));
} catch (Throwable t) {
log.warn("Error while procesing file event", t);
}
}
key.reset();
}
}
当我复制一个文件,比如说名字是"abc.txt",日志会显示:
新文件 abc.txt
文件已修改.... abc.txt
非常期待您的回复。