Java 监视目录时仅激发一次事件

Java 监视目录时仅激发一次事件,java,nio,Java,Nio,使用java.nio监视服务,我尝试监视一个目录及其所有子目录: Files.walkFileTree(projectPath, new SimpleFileVisitor<Path>() { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { WatchKey key = dir.regis

使用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;
    }
});
Files.walkFileTree(项目路径,新的SimpleFileVisitor(){
@凌驾
公共文件VisitResult preVisitDirectory(路径目录,基本文件属性属性属性)引发IOException{
WatchKey key=dir.register(watcher,StandardWatchEventTypes.ENTRY\u CREATE,
StandardWatchEventTypes.ENTRY\u MODIFY、StandardWatchEventTypes.ENTRY\u DELETE);
put(key,newwatchabledirectory(dir,projectPath));
返回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) {
                         ....
                    }
             }
          ....
         }
    }
executor.submit(新的Runnable(){
@凌驾
公开募捐{
试一试{
监视键;
while((key=watcher.take())!=null){
别忘了打电话给我

key.reset();
while
循环中使用它之后

国家

否则,如果对象存在挂起事件,则此监视 密钥立即重新排队到监视服务。如果没有 挂起事件,然后将手表键置于就绪状态,并将 保持该状态,直到检测到事件或按下手表键 取消了

监视键可由多个并发线程安全使用。其中 有几个线程从手表中检索信号键 然后,应注意确保重置方法正确 仅在处理对象的事件后调用。此 确保一个线程在任何时间处理对象的事件 时间

所以如果你不重置,就好像你的手表被禁用了

WatchKey#reset()
返回一个布尔值,判断它是否有效。请按照中的说明处理该情况

强调:

处理密钥事件后,需要将 通过调用reset将键返回到就绪状态。如果此方法返回 false,密钥不再有效,循环可以退出。此步骤无效 非常重要。如果调用重置失败,此键将不会收到 任何进一步的活动。


这句话最尖锐:“这一步非常重要。如果您未能调用重置,此键将不会收到任何进一步的事件。”