Java 7 Tage NIO.2 – Rekursiv durch einen Verzeichnisbaum

NIO2 stellt eine Erweiterung der File API in der Java Welt dar. Was davon in Java 7 auf uns zukommt, und wie mit NIO in einen Verzeichnisbaum gesucht wird hier

Es ist soweit, Oracle hat Java 7 veröffentlicht! Ebenfalls kurz und bündig auf java.net beworben, schon bereit zum Download. Laut Jaxenter inkludiert es 9.494 Bugfixes, 1.966 Überarbeitungen, 9.018 Changesets und 147 Builds. Die genauen Unterschiede zwischen diesen Begriffen bitte dort nachfragen, es klingt jedenfalls nach einer Menge Arbeit :) Das heißt nun könnt ihr auch direkt mit der neuen Version das hier gezeigte ausprobieren!

Darum gleich zurück zum heutigen Topic und ab durch den Verzeichnisbaum mit NIO2! Dazu werden in java.nio.Files zwei statische Methoden bereitgestellt:

java.nio.Files.walkFiletree(Path start, FileVisitor<? super Path> visitor);
java.nio.Files.walkFiletree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor);

Gleich mal zur Erklärung der Parameter:

start – Hier wird der Pfad übergeben der als Wurzelelement des Verzeichnisbaums dienen soll

options – Die FileVisitOption ist ein Enum und bietet Optionen in Bezug auf Symbolische Links(FOLLOW_LINKS) und Zyklenkennung (DETECT_CYCLES).

maxDepth – maximale Suchtiefe, also die Anzahl der Subverzeichnisse bis zu denen vorgegangen wird. Wäre maxDepth 3 und wir würden /home/nullpointer/1/2/3 von /home aus durchsuchen kämen wir also nur bis /home/nullpointer/1/2

visitor – Das FileVisitor Interface bietet dem Entwickler die Möglichkeit an diversen Punkten der rekursiven Suche einzuspringen. Bereits anhand der Namen der Methoden lässt sich zuordnen, wann dies geschieht:

FileVisitor.postVisitDirectory();
FileVisitor.preVisitDirectory();
FileVisitor.visitFile();
FileVisitor.visitFileFailed();

Diese Methoden liefern alle ein Ergebnis vom Typ FileVisitorResult zurück, mit dem bestimmt wird ob die Suche fortgesetzt wird oder nicht. Die möglichen Resultate sind: CONTINUE, SKIP_SIBLINGS, SKIP_SUBTREE, TERMINATE

Eine Implementierung des FileVisitors liefert Oracle gleich mit: SimpleFileVisitor. Dieser implementiert die oben angeführten Methoden Read-Only und wirft lediglich einen Fehler sollte eine Exception auftreten.

Happy NIOing bzw. FileVisiting :)

Ähnliche Artikel:

Java 7 Tage NIO.2 – FileSystem & Path

NIO2 stellt eine Erweiterung der File API in der Java Welt dar. Was davon in Java 7 auf uns zukommt, und wie mit FileSystem und Path.umgeht hier

Neben dem Project Coin wird NIO.2 in Java 7 vermutlich die zweite große Änderung sein, die von einem Großteil der Java-Entwickler, aber vor allem auch von Anfängern wahrgenommen werden wird. Wobei Anfänger werden es nicht als Änderung bemerken, solange sie nicht über die ganzen veralteten Codebeispiele stolpern. NIO.2 steht recht simpel für new i/o Teil 2 und bringt einige Basisfunktionen mit sich, von denen man meinen sollte eine fortgeschrittene Sprache wie Java sollte diese eigentlich längst beinhalten. Doch hierbei gilt, besser spät als nie und bevor ich auf die Möglichkeiten von NIO.2 zurückzukommen möchte noch ein Wort zur alten Implementierung. Bisher waren in Java Filezugriffe über java.io.* und spezifischer java.io.File möglich. Ohne adäquates Exceptionhandling und mit einer Menge aus zu programmierenden Funktionalität war es durchaus recht mühsam ans Ziel zu kommen. NIO.2 setzt hier an und bietet unter java.nio.* eine neue Herangehensweise an.

FileSystem

Die neue abstrakte Klasse FileSystem repräsentiert ein Dateisystem. Konkrete Implementierungen sind zB das lokale Filesystem oder aber auch ein ZIP oder JAR Archiv. Um das aktuelle Dateisystem auszulesen gibt es eine Helferklasse: FileSystems welches die statische Methode getDefault() zur verfügung stellt.

FileSystem fs = FileSystems.getDefault();

Path

Mittels der Path Klasse versucht man das alte java.io.File abzulösen. Ein Path repräsentiert dabei einen relativen oder aber absoluten Pfad, File hingegen die Datei oder das Verzeichnis. Dabei können die Pfadangaben je nach Betriebssystem unterschiedlich erfolgen. Der Pfad kann aus einem String, einer URI oder sogar einem File erzeugt werden und ist immutable.

Path p = fs.getPath("C:/windows/");

Auch hierbei gibt es eine Utilityklasse die einem den Aufruf über das FileSystem abnimmt: Paths#get(); Auch kann man sich wieder einen String eine URI oder ein File Objekt zur Weiterverarbeitung über die Path Klasse erzeugen lassen.

p.toString();
p.toUri();
p.toFile();

Zugriffe auf die einzelnen Elemente des Pfades ermöglicht Path da es eine hierarchische Liste der Namen hält. Zur weitern Verarbeitung dieser Elemente bietet Path einige Methoden

p.getRoot();
p.getParent();
p.getNameCount();
p.getName(int index);
p.subpath(int beginIndex, int endIndex);

Da Path das Interface Iterable implementiert kann er auch in foreach Schleifen verwendet werden um die einzelnen Subelemente zu erhalten. Um den Path mit anderen vergleichen zu können implementiert die Klasse das Interface Compareable und bietet Funktionen wie

p.compareTo(Path otherPath); // aus dem Compareable Interface
p.startsWith(Path otherPath);
p.endsWith(Path otherPath);

Pfade lassen sich außerdem mittels

p.resolve(“system32”);

zusammenhängen. Oder aber über

p.toRealPath(LinkOption… options);
p.toAbsolutePath);

Für mehr Details zu FileSystem oder Path am besten einen Blick ins API werfen: http://download.java.net/jdk7/docs/api/ Happy NIOing

Ähnliche Artikel: