监视目录时仅触发一次事件
使用java.nio监视服务,我尝试监视一个目录及其所有子目录:
Files.walkFileTree(projectPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
WatchKey key = dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);
watched.put(key, new WatchableDirectory(dir, projectPath));
return FileVisitResult.CONTINUE;
}
});
然后我等待事件:
executor.submit(new Runnable() {
@Override
public void run() {
try {
WatchKey key;
while ((key = watcher.take()) != null) {
List<WatchEvent<?>> events = key.pollEvents();
WatchableDirectory watchableDirectory = watched.get(key);
for (WatchEvent<?> event : events) {
....
}
}
....
}
}
(watched
是保存从键到有关目录的元数据的映射的Map
但是,仅触发给定目录的第一个事件。每当我更改目录中的另一个文件时,如果文件已被更改,则不会发生任何事情(我通过放置断点并期望 for 循环中的逻辑发生来验证这一点)。
但是,如果我修改另一个目录中的文件,那么一切都可以正常工作(同样,只是第一次)。
不会引发任何异常(有一个 catch 子句 ),并且循环显然继续运行。java.lang.Exception
我认为可能一旦使用,目录可能会被注销。因此,我添加了一行,以便在处理其文件后重新注册它。无效果。
Windows 7, Java 7.
任何想法为什么?