JAVA 7 监控服务

3

当应用程序启动时,如何让监视服务处理目录中的所有文件?

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

3个回答

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


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

那么,在第一行完成后,而在第五行开始之前创建的文件怎么办?我只是使用这个粗略的边界使讨论更容易。 文件丢失的机会窗口的真正边界可能更宽。


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

如果使用

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

...只有新创建的文件才会被报告。如果要观察已经创建的文件,请使用:

StandardWatchEventKinds.ENTRY_MODIFY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接