javanio监视服务

kmbjn2e3  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(323)

我有一个java项目,我们需要不断监听一些路径,以检测是否有任何新的xml文件,如果是真的,我们需要通过其他一些规则来处理它。
watchservice在发现是否有新文件需要处理方面做得很好,但是我无法管理它以便读取文件,我只是从事件中返回文件名。
有什么办法可以用watchservice来实现吗?如果没有,还有什么建议可以达到?
谢谢。

z0qdvdin

z0qdvdin1#

当然,你可以轻松地说:
创建监视服务:

WatchService watchService = null;

 try {
     watchService = FileSystems.getDefault().newWatchService();
     Path path = get(pathToSee);
     path.register(watchService, new WatchEvent.Kind[]{ENTRY_MODIFY, ENTRY_CREATE}, SensitivityWatchEventModifier.HIGH);
     watchEvent(watchService, path);
     log.info("Watch Service has ben created!");
 } catch (IOException e) {
     log.error("Exception has ben throw when the service have tried to createWatchService()", e);
 }

注意:如果要添加大量文件,可以将:

SensitivityWatchEventModifier.HIGH

增加敏感度。
注意目录中是否有更改:

WatchKey key;
 while (true) {
     try {
         if ((key = watchService.take()) == null) break;

         for (WatchEvent<?> event : key.pollEvents()) {
             log.info("Event kind:" + event.kind()
                     + ". File affected: " + event.context() + ".");

             String fileName = event.context().toString();
             File directory = path.toFile();
             yourService.readContent(directory, fileName);
         }
         key.reset();
     } catch (InterruptedException | IOException e) {
         log.error("InterruptedException when try watchEvent()" + e);
     }
 }

最后,你可以用这些信息做你想做的事情:

try (BufferedReader br = new BufferedReader(new FileReader(directory + "/" + fileName))) {
     String strLine;
     while ((strLine = br.readLine()) != null) {
             }
         }
     }
 }

提示:
您可以创建一个separate线程来实现这一点,或者使用spring@async创建一个separate线程来处理此信息并提高应用程序中的并发性。
你也可以使用apachecommons!
例如:

public void getAll() throws Exception {
    FileAlterationObserver observer = new FileAlterationObserver(pathToSee);
    observer.addListener(new FileAlterationListenerAdaptor() {

        @SneakyThrows
        @Override
        public void onFileCreate(File file) {

        }

        @Override
        public void onFileDelete(File file) {

        }
    });
}

相关问题