Différences entre l’API Java WatchService et la bibliothèque du moniteur Apache Commons IO

Différences entre l'API Java WatchService et la bibliothèque du moniteur Apache Commons IO

1. Vue d'ensemble

Bien avant la publication de l'API JavaWatchService dans Java 7, la bibliothèque Apache Commons IO Monitoring traitait déjà le même cas d'utilisation de la surveillance d'un emplacement de système de fichiers ou d'un répertoire pour les modifications.

Dans cet article, nous allons explorer les différences entre les deux API.

2. Dépendances Maven

Pour utiliser Apache Commons IO, la dépendance suivante doit être ajoutée dans lespom:


    commons-io
    commons-io
    2.5

Et bien sûr, le service de surveillance fait partie du JDK, il n’a donc besoin d’aucune dépendance externe.

3. Comparaison des fonctionnalités

3.1. Traitement piloté par les événements

L'APIWatchService est pilotée par les événements de modification du système de fichiers déclenchés par le système d'exploitation. Cette approche évite à l'application d'interroger le système de fichiers à plusieurs reprises pour connaître les modifications.

La bibliothèque Apache Commons IO Monitor, d'autre part, interroge l'emplacement du système de fichiers à un intervalle de veille configurable en appelant la méthodelistFiles() de la classeFile. Cette approche gaspille les cycles de la CPU, surtout si aucun changement ne survient.

3.2. Méthode de rappel

L'API deWatchService ne fournit pas de méthodes de rappel. Au lieu de cela, il fournit deux types de méthodes d'interrogation pour vérifier si de nouveaux événements de modification sont disponibles pour le traitement:

  1. Méthodes de blocage telles quepoll() (avec un paramètre timeout) ettake()

  2. Méthode non bloquante commepoll() (sans paramètre de délai)

Avec les méthodes de blocage, le thread de l'application commence le traitement uniquement lorsque de nouveaux événements de modification sont disponibles. Par conséquent, il n'est pas nécessaire de continuer à interroger de nouveaux événements.

Les détails et l'utilisation de ces méthodes se trouvent dans notre articlehere.

En revanche, la bibliothèque Apache Commons IO fournit des méthodes de rappel sur l'interfaceFileAlterationListener qui sont appelées lorsqu'une modification de l'emplacement ou du répertoire du système de fichiers est détectée.

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. Dépassement d'événement

L'API deWatchService est pilotée par les événements du système d'exploitation. Par conséquent, il est possible que le tampon du système d'exploitation contenant les événements déborde, si l'application ne peut pas traiter les événements assez rapidement. Dans ce scénario, l'événementStandardWatchEventKinds.OVERFLOW est déclenché, indiquant que certains des événements sont perdus ou ignorés avant que l'application puisse les lire.

Cela nécessite une gestion appropriée de l'événementOVERFLOW dans l'application pour garantir que l'application peut gérer toute rafale soudaine d'événements de changement qui peut déclencher l'événementOVERFLOW.

La bibliothèque Commons IO, d’autre part, n’est pas basée sur les événements du système d’exploitation et il n’est donc pas question de débordement.

Dans chaque sondage, l'observateur obtient la liste des fichiers du répertoire et la compare à la liste obtenue lors du sondage précédent.

  1. Si un nouveau nom de fichier est trouvé dans le dernier sondage,onFileCreate() est appelé sur l'écouteur

  2. Si un nom de fichier trouvé dans le sondage précédent est manquant dans la liste des fichiers obtenue à partir du dernier sondage,onFileDelete() est appelé sur l'écouteur

  3. Si une correspondance est trouvée, le fichier est vérifié pour tout changement d'attribut comme la dernière date de modification, la longueur, etc. Si un changement est détecté,onFileChange() est appelé sur l'écouteur

4. Conclusion

Dans cet article, nous avons réussi à mettre en évidence les principales différences entre les deux API.

Et, comme toujours, le code source complet des exemples utilisés dans cet article est disponible enthe Github project.