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



## Thomas Darimont (14. März 2009)

Hallo,

schaut mal hier:

```
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:

```
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


----------



## zeja (14. März 2009)

Hmm nen Listener wäre da aber irgendwie noch schicker.


----------



## procurve (15. März 2009)

Sieht sehr nach NIO aus...


----------



## jeipack (16. März 2009)

Hi
Hätte man früher eine einfache Fileüberwachung in etwa so gemacht?

```
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


----------



## Thomas Darimont (16. März 2009)

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


----------



## mfgFragSchnell (29. November 2009)

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


----------



## zerix (29. November 2009)

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


----------

