Используя службу просмотра java.nio, я пытаюсь посмотреть каталог и все его подкаталоги:
Files.walkFileTree(projectPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
WatchKey key = dir.register(watcher, StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_MODIFY, StandardWatchEventKinds.ENTRY_DELETE);
watched.put(key, new WatchableDirectory(dir, projectPath));
return FileVisitResult.CONTINUE;
}
});
Затем я жду событий:
executor.submit(new Runnable() {
@Override
public void run() {
try {
WatchKey key;
while ((key = watcher.take()) != null) {
List<WatchEvent<?>> events = key.pollEvents();
WatchableDirectory watchableDirectory = watched.get(key);
for (WatchEvent<?> event : events) {
....
}
}
....
}
}
(watched
- это Map
, который содержит сопоставления от ключа к метаданным о каталоге)
Однако только первое событие для данного каталога запускается. Всякий раз, когда я меняю другой файл в каталоге, в котором файл уже был изменен, ничего не происходит (я проверяю, что, поставив точку останова и ожидая, что логика в for-loop будет иметь место).
Однако, если я изменяю файл в другом каталоге, тогда все работает (опять же, только в первый раз).
Никаких исключений не выбрасывается (есть предложение catch для java.lang.Exception
), и цикл, очевидно, продолжает работать.
Я подумал, что, возможно, однажды его уничтожил, каталог может быть отменен. Поэтому я добавил строку, чтобы перерегистрировать ее после обработки файла. Без эффекта.
Windows 7, Java 7.
Любые идеи, почему?