Java WatchService пропускает события, файлы - PullRequest
0 голосов
/ 07 июня 2018

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

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

  • Когда папка (уже с файлами) создана, она создается и создаетсяMODIFIED - таким образом два события для папки.Я могу жить с этим, но иногда он полностью пропускает файлы.(Полагаю, файлы копируются так быстро, что они есть еще до того, как эта новая папка будет зарегистрирована и проверена).

  • Когда я копирую несколько папок с файлами одновременно (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();
    }
    }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...