使用
java.nio观看服务,我尝试观看目录及其所有子目录:
Files.walkFileTree(projectPath, new SimpleFileVisitor() {
@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> events = key.pollEvents();
WatchableDirectory watchableDirectory = watched.get(key);
for (WatchEvent> event : events) {
....
}
}
....
}
}
(观看的是一个地图,保存从关键字到目录的元数据的映射)
但是,只有给定目录的第一个事件被触发.每当我在目录中更改另一个文件时,文件已经被更改,没有任何反应(我通过放置一个断点并期待在for-loop中的逻辑发生)来验证.
但是,如果我修改另一个目录中的文件,那么一切正常(再次,只有第一次).
抛出异常(java.lang.Exception有一个catch子句),并且循环显然继续运行.
我以为可能一旦消费,目录可能会被注销.所以我在文件被处理之后添加了一行来重新注册它.没有效果.
Windows 7,Java 7.
任何想法为什么?