Java NIO WatchService

问题描述

我有一个Java项目,我们需要继续侦听一些路径以检测是否有任何新的XML文件,如果为true,则需要通过一些其他规则来处理它。

WatchService在发现我是否有要处理的新文件方面做得很好,但是我无法对其进行管理,因此我可以读取该文件,只是将事件的文件名还给我。 / p>

使用WatchService有什么办法吗?如果没有,还有什么建议吗?

谢谢。

解决方法

当然,您可以轻松做到这一点:

  1. 创建监视服务:

     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

增加灵敏度。

  1. 观察目录中是否有更改:

     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);
         }
     }
    
  2. 最后,您可以使用该信息来做您想做的事情:

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

提示:

  1. 您可以创建一个单独的线程来执行此操作,或者使用Spring @Async创建一个单独的线程来处理此信息并提高应用程序的并发性。

  2. 您也可以使用Apache Commons!

例如:

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) {
            
        }
    });
}