Java watchservice, как найти каталог, в котором был создан файл? - PullRequest
1 голос
/ 07 апреля 2019

Я пытаюсь использовать Java Watchservice (NIO) для просмотра нескольких каталогов, я вижу событие create во всех каталогах, но не могу проследить обратно в каталог, где был создан файл.

Например, всякий раз, когда создается новый файл, я вижу только имя файла (без пути), как узнать, сработало ли событие 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 ]

3 голосов
/ 07 апреля 2019

Когда вы регистрируете 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 голос
/ 07 апреля 2019
Path newFile = ev.context();
Path absolutePath = newFile.toAbsolutePath();
...