Java watchservice,如何找到创建文件的目录?

时间:2019-04-07 20:05:16

标签: java nio

我正在尝试使用Java Watchservice(NIO)来监视多个目录,我可以在所有目录中看到create事件,但是无法追溯到创建文件的目录。

例如,每当创建一个新文件时,我只能看到一个文件名(无路径),如何知道创建事件是在传真文件夹还是传真文件夹2上触发的?

System.out.println("START MONITORING  **************");


Path faxFolder = Paths.get("E:\\activiti\\monitor\\m1");
Path faxFolder2 = Paths.get("E:\\activiti\\monitor\\m2");
WatchService watchService = FileSystems.getDefault().newWatchService();
faxFolder.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
faxFolder2.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);


boolean valid = true;
WatchKey watchKey = watchService.take();
for (WatchEvent<?> event : watchKey.pollEvents()) {
    WatchEvent.Kind kind = event.kind();
    if (StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind())) {
        String fileName = event.context().toString();
        System.out.println(fileName);

    }
}

2 个答案:

答案 0 :(得分:3)

注册watchService时,将为该目录提供WatchKey。您应该记住哪个键与哪个目录一起使用。

System.out.println("START MONITORING  **************");


Path faxFolder = Paths.get("E:\\activiti\\monitor\\m1");
Path faxFolder2 = Paths.get("E:\\activiti\\monitor\\m2");
WatchService watchService = FileSystems.getDefault().newWatchService();
Map<WatchKey,Path> keyMap = new HashMap<>();
WatchKey watchKey1 = faxFolder.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
keyMap.put(watchKey1, faxFolder);
WatchKey watchKey2 = faxFolder2.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
keyMap.put(watchKey2, faxFolder2);


while (!Thread.currentThread().isInterrupted()) {
    WatchKey watchKey = watchService.take();
    Path dir = keyMap.get(watchKey);
    for (WatchEvent<?> event : watchKey.pollEvents()) {
        WatchEvent.Kind kind = event.kind();
        if (StandardWatchEventKinds.ENTRY_CREATE.equals(event.kind())) {
            Path relativePath = (Path) event.context();
            String fileName = dir.resolve(relativePath).toString();
            System.out.println(fileName);

        }
    }
}

您的监视循环应等待事件(WatchService.take()),然后解决事件(watchKey.pollEvents())。所有这些都将适用于相同的WatchKey。然后,取下一个密钥,该密钥可能用于另一个目录。

答案 1 :(得分:1)

Path newFile = ev.context();
Path absolutePath = newFile.toAbsolutePath();