【问题标题】:JAVA 7 watch serviceJAVA 7 手表服务
【发布时间】:2012-03-13 06:13:59
【问题描述】:

如何让监视服务在应用程序启动时处理目录中的任何文件?

我已经运行了应用程序,但我注意到只有放入目录中的新文件会被处理,而从一开始就存在的文件会被忽略。

【问题讨论】:

    标签: java java-7 watchservice


    【解决方案1】:

    WatchService 监视注册对象的某些类型的更改和事件。当我们正在监听的事件发生时,代码会被调用。我们可能会监控文件的创建、删除或修改:

    • ENTRY_CREATE
    • ENTRY_DELETE
    • ENTRY_MODIFY

    如果使用

    WatchKey watchKey = path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
    

    ...只会报告新创建的文件。为了观察已经创建的文件,使用:

    StandardWatchEventKinds.ENTRY_MODIFY
    

    【讨论】:

      【解决方案2】:

      我在这里有相同的用例,我很惊讶我在网上没有发现对于这种常见场景有多大用处。我在以下方法中看到了一些问题。假设我们使用 walkTree 方法扫描目录中的现有文件,然后为 WatchService 注册目录。

      1. Files.walkTree(...);
      2. Path dir =  Paths.get(...);
      3. WatchService watcher = dir.getFileSystem().newWatchService();       
      4. dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE);
      5. // other logic
      

      在第 1 行刚刚结束和第 5 行开始之前创建的文件呢?我只是将其用作粗略的界限,以使讨论更容易。文件丢失机会的窗口的真正边界可能更宽。

      【讨论】:

        【解决方案3】:

        WatchService 只处理文件系统的变化。已经存在的文件没有被更改,因此不会被 WatchService 拾取。 您必须递归遍历所有文件和目录才能获得文件的初始“视图”:

        Files.walkFileTree(basePath, new SimpleFileVisitor<Path>() {
                    @Override
                    public FileVisitResult visitFile(Path file,
                            BasicFileAttributes attrs) throws IOException {
                        // do something with the file
                        return FileVisitResult.CONTINUE;
                    }
        
                    @Override
                    public FileVisitResult preVisitDirectory(Path dir,
                            BasicFileAttributes attrs) throws IOException {
                        // do something with the directory
                        return FileVisitResult.CONTINUE;
                    }
                });
        

        在初始化之后发生的所有更改都会被 WatchService 拾取。

        【讨论】:

          猜你喜欢
          • 2013-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多