Java : Observer les événements d'un dossier avec le WatchService

L'API NIO (Non-blocking I/O) WatchService permet d'observer les créations, modifications et suppressions de fichiers dans un dossier.

Le code suivant permet d'écrire dans la console le type d'événement et le nom du fichier créé, modifié ou supprimé dans le dossier.

import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

class FolderListener {

 private String pathStr;

 public FolderListener(String pathStr) {
  this.pathStr = pathStr;
 }

 /**
  * Écoute pour un nouvel événement dans le dossier 
  * 
  * @throws Exception
  */
 public void listen() throws Exception {

  /* Création du service */
  WatchService watchService = FileSystems.getDefault().newWatchService();

  /* Le chemin que l'on veut observer */
  Path path = Paths.get(pathStr);

  /* Enregistrement du chemin auprès du service et la liste des événements pris en charge */
  path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE,
   StandardWatchEventKinds.ENTRY_MODIFY);

  /* On attend un nouvel événement */
  WatchKey key;
  while ((key = watchService.take()) != null) {

   for (WatchEvent < ? > event : key.pollEvents()) {
    /* On affiche l'événement */
    System.out.println(formatEvent(event.kind(), event.context()));
   }

   key.reset();
  }
 }

 /**
  * Créer une phrase pour un événement du WatchService
  * 
  * @param eventKind    Le type de l'événement
  * @param eventContext Le context de l'événement ou Le nom du fichier
  * @return une phrase formatée
  */
 public String formatEvent(WatchEvent.Kind < ? > eventKind, Object eventContext) {

  if (eventKind == StandardWatchEventKinds.ENTRY_CREATE)
   return "Création du fichier " + eventContext + " dans le dossier " + pathStr;
  if (eventKind == StandardWatchEventKinds.ENTRY_MODIFY)
   return "Modification du fichier " + eventContext + " dans le dossier " + pathStr;
  if (eventKind == StandardWatchEventKinds.ENTRY_DELETE)
   return "Suppression du fichier " + eventContext + " dans le dossier " + pathStr;
  else
   return "Événement non pris en charge";

 }

}

Dans le main :

public class Main {

 public static void main(String[] args) throws Exception {
  FolderListener folderListener = new FolderListener(System.getProperty("user.home"));
  folderListener.listen();
 }

}

Vous pouvez changer le nom du dossier que vous voulez observer.

Commentaires