如何实现文件监视器来监视多个目录

时间:2015-11-18 14:00:48

标签: java

我需要监控多个文件夹以获取新文件通知。我试过单个目录它的工作正常。
我的文件夹结构看起来像是         路径路径= Paths.get(“c:\ users \ Test”);         Path path1 = Paths.get(“c:\ users \ test1”);         Path path2 = Paths.get(“c:\ users \ test2”);

public static void watchOutBoundDirectory(Path path) {
        String newFile = null;
        try {
            Boolean isFolder = (Boolean) Files.getAttribute(path, "basic:isDirectory", NOFOLLOW_LINKS);
            if (!isFolder) {
                throw new IllegalArgumentException("Path: " + path + " is not a folder");
            }
        } catch (IOException ioe) {
            // Folder does not exists
            ioe.printStackTrace();
        }
        // We obtain the file system of the Path
        FileSystem fs = path.getFileSystem();
        try (WatchService service = fs.newWatchService()) {
            path.register(service, ENTRY_CREATE);
            WatchKey key = null;
            while (true) {
                key = service.take();
                Kind<?> kind = null;
                for (WatchEvent<?> watchEvent : key.pollEvents()) {
                    kind = watchEvent.kind();
                    if (OVERFLOW == kind) {
                        continue; 
                    } else if (ENTRY_CREATE == kind) {
                        Path newPath = ((WatchEvent<Path>) watchEvent).context();
                        Path fullPath = path.resolve(newPath);
                        String newFile = fullPath.toString();
                    }
                }

                if (!key.reset()) {
                    break; // loop
                }
            }

        } catch (IOException ioe) {
            ioe.printStackTrace();
        } catch (InterruptedException ie) {
            ie.printStackTrace();
        }

    }

我尝试将每个目录注册到观察者。 WatchKey key1 = path1.register(watcher,ENTRY_CREATE); WatchKey key2 = path2.register(watcher,ENTRY_CREATE); 我想在程序启动时监视多个文件夹中的传入事件。平行监视文件夹,直到我停止程序。如何实施?

提前致谢。请帮忙 请帮忙

2 个答案:

答案 0 :(得分:1)

while (true) {
  ....
}

由于你有一个无限循环,一旦你调用了watchOutBoundDirectory静态函数。除非你禁用观察者,否则它永远不会逃避范围。

因此,要么为每个路径使用多线程,要么将路径数组传递给watchOutBoundDirectory并检查while(true)范围内的每个路径。

答案 1 :(得分:0)

如果你想监控多个文件夹,我认为一个好的解决方案是使用多线程程序,每个线程都会监控一个文件夹。