JAVA 7手表服务

时间:2012-02-22 21:00:58

标签: java java-7 watchservice

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

我已经运行了应用程序,但我注意到只处理了目录中删除的新文件,但忽略了从头开始存在的文件。

3 个答案:

答案 0 :(得分:4)

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会在初始化之后发生所有更改。

答案 1 :(得分: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行开始之前创建的文件怎么样?我只是将它作为一个粗略的界限,使讨论更容易。丢失文件的机会窗口的真正边界可能更广泛。

答案 2 :(得分:0)

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

  • ENTRY_CREATE
  • ENTRY_DELETE
  • ENTRY_MODIFY

如果使用

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

…仅报告新创建的文件。为了观察已经创建的文件,请使用:

StandardWatchEventKinds.ENTRY_MODIFY