Java WatchService пропускает события, файлы

Я хочу отслеживать папку для вновь созданных подпапок для конкретных файлов.csv, используя Java WatchService API (Windows 7 x64, Java 8). Я ожидаю, что окончательное приложение будет таким: папки \ файлы будут созданы где-то еще и загружены в облако (например, GDrive). Оттуда я синхронизирую их с локальной папкой (используя стандартное программное обеспечение). Эту локальную папку я хочу отслеживать и обрабатывать файлы в течение нескольких минут после их появления. Также очень важно не пропустить ни одного нового файла.

Я использую WatchService, как и во многих уроках и вопросах, но все же он ведет себя странно.

  • Когда папка (уже с файлами) создана, она СОЗДАНА и ИЗМЕНЕНА - таким образом, два события для папки. Я могу жить с этим, но иногда он полностью пропускает файлы. (Полагаю, файлы копируются так быстро, что они есть еще до того, как эта новая папка будет зарегистрирована и проверена).

  • Когда я копирую несколько папок с файлами одновременно (F1,F2,F3), то это:
    регистрирует F1, обнаруживает измененные файлы в F1, обрабатывает их, регистрирует F2, регистрирует F3.
    Опять же, файлы в двух последних папках все равно не обнаруживаются.

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

Более общий вопрос - что происходит между ws.take() и ws.pollEvents() и ws.reset()? Есть ли слепые моменты, когда события не регистрируются?

    public static void main(String args[]) {
    // SET UP LOGGER AND CONFIG VARIABLES HERE

    // CREATE AN OBJECT AND DEFINE AN ABSTRACT startListening()
    WatchServiceClass wsc = new WatchServiceClass() {
       public void startListening(WatchService watchService) {
        while (true) {
            WatchKey queuedKey = watchService.take();
            // DOESNT HELP: Thread.sleep(1000);
            List<WatchEvent<?>> events = queuedKey.pollEvents();
            for (WatchEvent<?> watchEvent : events) {
                if (watchEvent.kind() == StandardWatchEventKinds.OVERFLOW) {
                    continue;
                }
                String action // create, modify or delete 
                String fileName // self explanatory
                String fullPath
                String fullPathParent


                if (action.equals("create")) { // TRACK NEW FOLDERS
                    registerDir(Paths.get(fullPath), watchService);
                }

                if (new File(fullPath).isDirectory()) {
                    continue; // NOT DOING ANYTHING WITH DIRECTORIES
                } 
                // IF HERE, THEN THIS IS THE FILE, DO SOMETHING
                // TAKES SEVERAL MINUTES
            }

            if (!queuedKey.reset()) {
                keyPathMap.remove(queuedKey);
            }
            if (keyPathMap.isEmpty()) {
                break;
            }
        }
    }
    };
     // END OF startListening() METHOD DEFINITION  

    while (true) { // MAIN INFINITE LOOP
      try (WatchService watchService = FileSystems.getDefault().newWatchService()) {
        wsc.registerDir(Paths.get(DATA_DIR), watchService); 
        wsc.startListening(watchService);
    } catch (Exception e) {
        e.printStackTrace();
    }
    }
    }

0 ответов

Другие вопросы по тегам