Java 7 - Verzeichnisse auf Änderungen überwachen mit dem WatchService

Thomas Darimont

Erfahrenes Mitglied
Hallo,

schaut mal hier:
Java:
package de.tutorials.training;

import static java.nio.file.StandardWatchEventKind.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKind.ENTRY_DELETE;
import static java.nio.file.StandardWatchEventKind.ENTRY_MODIFY;

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

public class FileSystemWatcherExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		WatchService watchService = FileSystems.getDefault().newWatchService();
		System.out.println(watchService);
		WatchKey watchKey = Paths.get("/tmp").register(watchService,new Kind<?>[] { ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE });

		while (true) {
			watchKey = watchService.take();

			for (WatchEvent<?> watchEvent : watchKey.pollEvents()) {
				System.out.println(watchEvent.kind() + " "
						+ ((Path) watchEvent.context()));
			}

			watchKey.reset();
		}
	}
}

Wenn ich nun in der shell in /tmp/ ein
echo xxx>test1.data
absetze bekomme ich die Ausgabe:
Code:
ENTRY_CREATE test1.data
ENTRY_MODIFY test1.data

Mehr dazu gibts hier:
http://openjdk.java.net/projects/nio/javadoc/java/nio/file/WatchService.html
http://openjdk.java.net/projects/nio/presentations/TS-5686.pdf

Ich weis aber noch nicht wie man den absoluten Pfad der geänderten Datei herausbekommt...

Gruß Tom
 
Hi
Hätte man früher eine einfache Fileüberwachung in etwa so gemacht?
Java:
while(true) {
File f = new File("pfad");
if(f.exists()) {
doSomething();
}
try { Thread.sleep(500)  } catch (Exception ex) {};
}
Um ein Verzeichnis zu überwachen könne man pfad auf ein Verzeichnis setzen und dann alle darin enthaltenen Daten immer wieder abfragen und mit dem vorigen Resultat vergleichen.
Macht WatchService sowas änliches?

Ahja wieso hast du in deine while(true) Schleife kein sleep eingebaut? Wird die automatisch "abgebremmst"?

Gruss
 
Hallo,

jo, da sollte man ein TimeUnit.SECONDS.sleep(...) einbauen. Hab etwas an dem Beispiel herumgebastelt und watchKey = watchService.take(); entfernt.
WatchService.take() wartet auf neue Ereignisse vom FileSystem.

Gruß Tom
 
warum meckert mein eclipse, dass es die java.nio.file... nich tkennt!? hab doch das neuste jdk!
 
Hallo,

das ist ganz leicht. Wenn du auf den Titel achtest, wirst du sehen, dass es hier um Java 7 geht und nicht um Java 6. Java 7 ist noch nicht fertig.

Gruß

Sascha
 

Neue Beiträge

Zurück