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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 3 511 fois - Téléchargée 16 fois

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

Ajouter un commentaire

Commentaire

Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
286
Salut,

Merci pour cet exemple. Je vais mettre à jour mon jdk demain pour tester ça je pense.

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.