Unterschiede zwischen der Java WatchService-API und der IO-Monitor-Bibliothek von Apache Commons

Unterschiede zwischen der Java WatchService-API und der Apache Commons IO Monitor Library

1. Überblick

Lange bevor die JavaWatchService-API in Java 7 veröffentlicht wurde, befasste sich die Apache Commons IO Monitoring-Bibliothek bereits mit demselben Anwendungsfall der Überwachung eines Dateisystemspeicherorts oder -verzeichnisses auf Änderungen.

In diesem Artikel untersuchen wir die Unterschiede zwischen den beiden APIs.

2. Maven-Abhängigkeiten

Um Apache Commons IO verwenden zu können, muss die folgende Abhängigkeit inpom hinzugefügt werden:


    commons-io
    commons-io
    2.5

Und natürlich ist der Uhrendienst Teil des JDK, sodass keine externe Abhängigkeit erforderlich ist.

3. Funktionsvergleich

3.1. Ereignisgesteuerte Verarbeitung

Die API vonWatchServicewird von den vom Betriebssystem ausgelösten Änderungsereignissen des Dateisystems gesteuert. Durch diesen Ansatz wird verhindert, dass die Anwendung das Dateisystem wiederholt auf Änderungen abfragt.

Die Apache Commons IO Monitor-Bibliothek fragt dagegen den Speicherort des Dateisystems in einem konfigurierbaren Ruheintervall ab, indem dielistFiles()-Methode derFile-Klasse aufgerufen wird. Dieser Ansatz verschwendet CPU-Zyklen, insbesondere wenn keine Änderung auftritt.

3.2. Rückrufmethode

Die API vonWatchServicebietet keine Rückrufmethoden. Stattdessen werden zwei Arten von Abfragemethoden bereitgestellt, um zu überprüfen, ob neue Änderungsereignisse für die Verarbeitung verfügbar sind:

  1. Blockierungsmethoden wiepoll() (mit einem Timeout-Parameter) undtake()

  2. Nicht blockierende Methode wiepoll() (ohne Timeout-Parameter)

Mit den Blockierungsmethoden beginnt der Anwendungsthread erst dann mit der Verarbeitung, wenn neue Änderungsereignisse verfügbar sind. Daher muss nicht ständig nach neuen Ereignissen abgefragt werden.

Einzelheiten und Verwendung dieser Methoden finden Sie in unserem Artikelhere.

Im Gegensatz dazu bietet die Apache Commons IO-Bibliothek Rückrufmethoden auf derFileAlterationListener-Schnittstelle, die aufgerufen werden, wenn eine Änderung des Dateisystemspeicherorts oder -verzeichnisses festgestellt wird.

FileAlterationObserver observer = new FileAlterationObserver("pathToDir");
FileAlterationMonitor monitor = new FileAlterationMonitor(POLL_INTERVAL);
FileAlterationListener listener = new FileAlterationListenerAdaptor() {
    @Override
    public void onFileCreate(File file) {
        // code for processing creation event
    }

    @Override
    public void onFileDelete(File file) {
        // code for processing deletion event
    }

    @Override
    public void onFileChange(File file) {
        // code for processing change event
    }
};
observer.addListener(listener);
monitor.addObserver(observer);
monitor.start();

3.3. Ereignisüberlauf

Die API vonWatchServicewird von den Betriebssystemereignissen gesteuert. Daher besteht die Möglichkeit, dass der Betriebssystempuffer, der die Ereignisse enthält, überläuft, wenn die Anwendung die Ereignisse nicht schnell genug verarbeiten kann. In diesem Szenario wird das EreignisStandardWatchEventKinds.OVERFLOW ausgelöst, um anzuzeigen, dass einige der Ereignisse verloren gehen oder verworfen werden, bevor die Anwendung sie lesen kann.

Dies erfordert eine ordnungsgemäße Behandlung des EreignissesOVERFLOWin der Anwendung, um sicherzustellen, dass die Anwendung plötzliche Änderungsereignisse verarbeiten kann, die das EreignisOVERFLOWauslösen können.

Die Commons IO-Bibliothek basiert hingegen nicht auf den Ereignissen des Betriebssystems, sodass von einem Überlauf keine Rede ist.

Bei jeder Umfrage erhält der Beobachter die Liste der Dateien im Verzeichnis und vergleicht sie mit der Liste aus der vorherigen Umfrage.

  1. Wenn in der letzten Abfrage ein neuer Dateiname gefunden wird, wirdonFileCreate() im Listener aufgerufen

  2. Wenn ein in der vorherigen Umfrage gefundener Dateiname in der aus der letzten Umfrage erhaltenen Dateiliste fehlt, wirdonFileDelete() im Listener aufgerufen

  3. Wird eine Übereinstimmung gefunden, wird die Datei auf Änderungen an Attributen wie Datum der letzten Änderung, Länge usw. überprüft. Wenn eine Änderung erkannt wird, wirdonFileChange() im Listener aufgerufen

4. Fazit

In diesem Artikel haben wir es geschafft, die wichtigsten Unterschiede in den beiden APIs hervorzuheben.

Und wie immer ist der vollständige Quellcode für die in diesem Artikel verwendeten Beispiele inthe Github project verfügbar.