Java 7 WatchService - Ignoriert mehrere Vorkommen desselben Ereignisses

Der Javadoc fürStandardWatchEventKinds.ENTRY_MODIFY sagt:

Verzeichniseintrag geändert. Wenn ein Verzeichnis für dieses Ereignis registriert ist, wird der WatchKey in die Warteschlange gestellt, wenn festgestellt wird, dass ein Eintrag im Verzeichnis geändert wurde. Die Ereignisanzahl für dieses Ereignis beträgt 1 oder mehr.

Wenn Sie den Inhalt einer Datei über einen Editor bearbeiten, werden sowohl das Datum (oder andere Metadaten) als auch der Inhalt geändert. Sie erhalten also zweiENTRY_MODIFY Ereignisse, aber jeder wird eine habencount von 1 (zumindest sehe ich das).

Ich versuche eine Konfigurationsdatei zu überwachen (servers.cfg zuvor registriert bei derWatchService), die manuell aktualisiert wird (dh über die Befehlszeilevi) mit folgendem Code:

while(true) {
    watchKey = watchService.take(); // blocks

    for (WatchEvent<?> event : watchKey.pollEvents()) {
        WatchEvent<Path> watchEvent = (WatchEvent<Path>) event;
        WatchEvent.Kind<Path> kind = watchEvent.kind();

        System.out.println(watchEvent.context() + ", count: "+ watchEvent.count() + ", event: "+ watchEvent.kind());
        // prints (loop on the while twice)
        // servers.cfg, count: 1, event: ENTRY_MODIFY
        // servers.cfg, count: 1, event: ENTRY_MODIFY

        switch(kind.name()) {
            case "ENTRY_MODIFY":
                handleModify(watchEvent.context()); // reload configuration class
                break;
            case "ENTRY_DELETE":
                handleDelete(watchEvent.context()); // do something else
                break;              
        }
    }   

    watchKey.reset();       
}

Da bekommt man zweiENTRY_MODIFY In diesem Fall würde die Konfiguration zweimal neu geladen, wenn nur einmal benötigt wird. Gibt es eine Möglichkeit, alle außer einem dieser Ereignisse zu ignorieren, vorausgesetzt, es könnte mehr als ein solches Ereignis geben?

Wenn dasWatchService API hat ein solches Dienstprogramm umso besser. (Ich möchte nicht die Zeiten zwischen den einzelnen Ereignissen überprüfen. Alle Handlermethoden in meinem Code sind synchron.

Dasselbe passiert, wenn Sie eine Datei aus einem Verzeichnis in das überwachte Verzeichnis kopieren / einfügen. Wie kann man beides zu einem Event kombinieren?

Antworten auf die Frage(13)

Ihre Antwort auf die Frage