Ich habe einen Watcher, der meine Datenstrukturen aktualisiert, wenn eine Änderung gehört wird. Wenn die Änderung jedoch nicht sofort erfolgt (d. H. Wenn eine große Datei von einem anderen Dateisystem kopiert wird oder ein großer Teil der Datei geändert wird), versucht die Datenstruktur zu früh zu aktualisieren und gibt einen Fehler aus.Java Watch Service - Warte, bis die Änderungen abgeschlossen sind
Wie kann ich meinen Code ändern, so dass updateData()
nach nur die letzten genannt wird ENTRY_MODIFY
genannt wird, statt nach jedem einzelnen ENTRY_MODIFY
.
private static boolean processWatcherEvents() {
WatchKey key;
try {
key = watcher.poll(10, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
return false;
}
Path directory = keys.get(key);
if (directory == null) {
return false;
}
for (WatchEvent <?> event : key.pollEvents()) {
WatchEvent.Kind eventKind = event.kind();
WatchEvent <Path> watchEvent = (WatchEvent<Path>)event;
Path child = directory.resolve(watchEvent.context());
if (eventKind == StandardWatchEventKinds.ENTRY_MODIFY) {
//TODO: Wait until modifications are "finished" before taking these actions.
if (Files.isDirectory(child)) {
updateData(child);
}
}
boolean valid = key.reset();
if (!valid) {
keys.remove(key);
}
}
return true;
}
Haben Sie assign Kind zu einem varialbe, und nach der Schleife beenden, führen updateDate versucht? Oder ich vermisse die Idee hier? – Beri
Ich denke, die Antwort, die ich [hier] (http://stackoverflow.com/a/34718685/243373) gab, könnte das sein, was du brauchst, zumindest die Umrisse. –
War die Antwort in dem Link, den ich von irgendeinem Gebrauch gab? –