Java NIO 监视服务

Java NIO WatchService

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

WatchService 在发现我是否有要处理的新文件方面做得很好,但我无法管理它以便我可以读取文件,我只是从事件中返回文件名.

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