Observation du système de fichier sans polling avec java 7

Contenu du snippet

Avec Java 6, quand on voulait être informé des changements sur un système de fichiers (détecter qu'un fichier a été modifié par une autre application par exemple), il fallait sonder régulièrement le fichier en question (toutes les secondes par exemple). Ce système n'est pas très élégant ... ni très performant.

Java 7 enrichit le package java.nio et nous offre tous les outils pour pallier ce manque.
Le bout de code ci-dessous est un exemple d'utilisation de ces outils.
Il fonctionne parfaitement mais se veut simplifié au maximum, pour une première approche.
Il consiste à observer les changements dans le répertoire "D:\test" et à les signaler sobrement sur la sortie standard.

Source / Exemple :


import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;

public class ObserveurModificationFichier {

	public static void main(String[] args) throws IOException {

		FileSystem fileSystem = FileSystems.getDefault();
		WatchService watcher = fileSystem.newWatchService();
		Path path = fileSystem.getPath("D:/test");
		WatchEvent.Kind<?> kind;

		WatchKey token = path.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY,
				StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE);

		while (true) {

			try {
				token = watcher.take();
			} catch (InterruptedException interruption) {
				return;
			}

			for (WatchEvent<?> event : token.pollEvents()) {

				kind = event.kind();
				path = (Path) event.context();
				System.out.println(kind + " : " + path);

			}

			if (!token.reset()) {
				break;
			}

		}

	}

}

Conclusion :


Ce bout de code ne propose pas un certains nombre de fonctionnalités :
- la boucle infinie de récupération des événements est exécutée dans le thread principal, ce n'est donc pas utilisable tel quel puisque son exécution bloque le thread principal
- il ne surveille qu'un répertoire
- il ne surveille pas les sous-répertoires

Toutes ces fonctionnalités peuvent être facilement implémentées, avis aux amateurs qui auraient plus de temps libre que moi.

Pour une documentation plus complète, consulter la documentation Oracle :
http://docs.oracle.com/javase/tutorial/essential/io/notification.html

(les espaces qui peuvent se trouver dans l'URL semblent insérés automatiquement par javafr, il faudra les éliminer pour accéder à la doc)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.