JavaNioWatchService

JavaNioWatchService,java,xml,nio,watchservice,Java,Xml,Nio,Watchservice,我有一个Java项目,我们需要监听一些路径来检测是否有任何新的XML文件,如果是真的,我们需要通过一些其他规则来处理它 WatchService在发现是否有新文件需要处理方面做得很好,但我无法管理它以便读取该文件,我只是从事件中返回文件名 有没有办法通过WatchService实现这一点?如果没有,还有什么建议要提出 谢谢。当然,您可以轻松做到: 创建监视服务: WatchService watchService = null; try { watchService = File

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

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

有没有办法通过WatchService实现这一点?如果没有,还有什么建议要提出


谢谢。

当然,您可以轻松做到:

  • 创建监视服务:

     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);
         }
     }
    
  • 小贴士:

  • 您可以创建一个separate线程来完成此任务,或者使用Spring@Async创建一个separate线程来处理此信息并提高应用程序中的并发性

  • 你也可以使用ApacheCommons

  • e、 g:


    如果你有文件名,你就不能打开文件吗?如果“只是文件名”,你指的是结果,那么只需根据目录解析它就可以得到完整的路径。
     try (BufferedReader br = new BufferedReader(new FileReader(directory + "/" + fileName))) {
         String strLine;
         while ((strLine = br.readLine()) != null) {
                 }
             }
         }
     }
    
    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) {
                
            }
        });
    }