Услуга за гледане на 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