Java 监视目录时仅激发一次事件
使用java.nio监视服务,我尝试监视一个目录及其所有子目录: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
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,密钥不再有效,循环可以退出。此步骤无效
非常重要。如果调用重置失败,此键将不会收到
任何进一步的活动。
这句话最尖锐:“这一步非常重要。如果您未能调用重置,此键将不会收到任何进一步的事件。”