Я хочу отслеживать папку для вновь созданных подпапок для конкретных файлов .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();
}
}
}