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

1. Vue d'ensemble

Bien avant la publication de l' API Java WatchService 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 de Maven

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

 commons-io commons-io 2.5 

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

3. Comparaison des fonctionnalités

3.1. Traitement piloté par les événements

L' API WatchService 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 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éthode listFiles () de la classe File . Cette approche gaspille des cycles de processeur, surtout si aucun changement ne se produit.

3.2. Méthode de rappel

L' API WatchService 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 comme poll () (avec un paramètre timeout) et take ()
  2. Méthode non bloquante comme poll () (sans paramètre de délai)

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

Les détails et l'utilisation de ces méthodes peuvent être trouvés dans notre article ici.

En revanche, la bibliothèque Apache Commons IO fournit des méthodes de rappel sur l' interface FileAlterationListener 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 WatchService est pilotée par les événements du système d'exploitation. Par conséquent, il est possible que la mémoire tampon du système d'exploitation qui contient les événements déborde, si l'application ne peut pas traiter les événements assez rapidement. Dans ce scénario, l'événement StandardWatchEventKinds.OVERFLOW est déclenché indiquant que certains des événements sont perdus ou supprimés avant que l'application puisse les lire.

Cela nécessite une gestion appropriée de l' événement OVERFLOW dans l'application pour garantir que l'application peut gérer toute rafale soudaine d'événements de modification pouvant déclencher l' événement OVERFLOW .

La bibliothèque Commons IO en revanche, 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 dans le répertoire et la compare avec la liste obtenue à partir du sondage précédent.

  1. Si un nouveau nom de fichier est trouvé dans le dernier sondage, onFileCreate () est invoqué sur l'écouteur
  2. Si un nom de fichier trouvé dans le sondage précédent est manquant dans la liste de fichiers obtenue à partir du dernier sondage, onFileDelete () est invoqué sur l'écouteur
  3. Si une correspondance est trouvée, le fichier est vérifié pour tout changement dans les attributs comme la date de la dernière modification, la longueur, etc. Si un changement est détecté, onFileChange () est invoqué 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 dans notre projet GitHub.