Java7监视服务

Java7监视服务,java,java-7,watchservice,Java,Java 7,Watchservice,当应用程序启动时,如何让watch服务处理目录中的任何文件 我已经让应用程序运行了,但是我注意到只有目录中的新文件被处理,而从一开始就存在的文件被忽略。WatchService只处理文件系统中的更改。已经存在的文件尚未更改,因此WatchService不会拾取这些文件。 您必须递归遍历所有文件和目录,以获得文件的初始“视图”: Files.walkFileTree(basePath, new SimpleFileVisitor<Path>() { @Overr

当应用程序启动时,如何让watch服务处理目录中的任何文件


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

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;
            }
        });
Files.walkFileTree(基本路径,新的SimpleFileVisitor(){
@凌驾
公共文件VisitResult visitFile(路径文件,
BasicFileAttributes(属性属性)引发IOException{
//对这个文件做些什么
返回FileVisitResult.CONTINUE;
}
@凌驾
公共文件VisitResult preVisitDirectory(路径目录,
BasicFileAttributes(属性属性)引发IOException{
//对目录做些什么
返回FileVisitResult.CONTINUE;
}
});

初始化后发生的所有更改都将由WatchService进行处理。

我在这里有相同的用例,我很惊讶我没有在网上找到对这种常见场景有用的东西。我发现以下方法存在一些问题。假设我们使用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行开始之前创建的文件呢。我只是想以此作为一个粗略的界限,使讨论更容易。丢失文件的机会窗口的实际边界可能更宽。

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

  • 条目创建
  • 条目删除
  • 输入/修改
如果使用

WatchKey watchKey = path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
…仅报告新创建的文件。要查看已创建的文件,请使用:

StandardWatchEventKinds.ENTRY_MODIFY