Служба часов JAVA 7

Как я могу заставить службу часов обрабатывать любые файлы, находящиеся в каталоге, при запуске приложения?

У меня уже запущено приложение, но я заметил, что обрабатываются только новые файлы, которые были переброшены в каталог, а файлы, которые были там с самого начала, игнорируются.


person Micheal Noel    schedule 22.02.2012    source источник


Ответы (3)


У меня есть тот же вариант использования, и я удивлен, что не нашел много полезного в Интернете для такого распространенного сценария. Я вижу некоторые проблемы в следующем подходе. Допустим, мы используем метод 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

Как насчет файлов, которые создаются после окончания строки 1 и до начала строки 5. Я просто использую это как грубую границу, чтобы облегчить обсуждение. Реальные границы окна возможности потери файлов могут быть еще шире.

person garlicbulb    schedule 21.05.2013

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.

person Clemens Sum    schedule 23.02.2012

WatchService отслеживает зарегистрированные объекты на предмет определенных типов изменений и событий. Код вызывается, когда происходит событие, которое мы слушаем. Мы можем отслеживать создание, удаление или изменение файла(ов):

  • ENTRY_CREATE
  • ENTRY_DELETE
  • ENTRY_MODIFY

При использовании

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

… будут сообщены только вновь созданные файлы. Чтобы просмотреть уже созданные файлы, используйте:

StandardWatchEventKinds.ENTRY_MODIFY
person Sabina Orazem    schedule 13.07.2019