Java SE 8 Programmer II: Java NIO.2

Die Klasse java.nio.file.Path repräsentiert einen Pfad im Dateisystem, bestehend aus Root, einer variablen List von Verzeichnissen und einem fakultativen File-Namen. Dabei wird per se nicht sichergestellt, dass das referenzierte Element im File-System tatsächlich existiert. Für den Aufbau eines Pfads wird java.nio.file.Paths.get(...) verwendet. Die angebotene Methode .get(URI uri) wird sehr selten verwendet.

getParent() gibt den Pfad vom Anfang an ohne Root (e.g. '/') und ohne den File-Namen zurück. Wenn kein Pfad vorhanden ist, gibt diese Methode null zurück.
getRoot() gibt den Root oder null zurück.

java.nio.file.Files verfügt ausschliesslich über statische Methoden, die für Basistasks rund um Files benötigt werden. Dabei wird das unterliegende Filesystem so weit möglich abstrahiert. Symbolischen Links wird per Default gefolgt.
Files.readAllLines(...) lieferte eine List<String> zurück, während Files.readAllBytes(...) einen bytes[] liefert.
Mit .delete() können Files und leere Verzeichnisse gelöscht werden.
Beim Kopieren und Verschieben von Files, lässt sich mittels StandardCopyOptions das Verhalten steuern:

Bildschirmfoto 2018-01-29 um 07.58.51.png

Beim Kopieren von einem File zu einem anderen kann die ATOMIC_MOVE Option nicht verwendet werden. Beim Kopieren von einem File in einen OutputStream können keine Optionen gesetzt werden. Beim Kopieren von einem InputStream in ein File kann nur REPLACE_EXISTING verwendet werden.
Beim Verschieben können nur ATOMIC_MOVE und REPLACE_EXISTING verwendet werden. Wenn ATOMIC_MOVE gesetzt ist, wird REPLACE_EXISTING ignoriert (auch wenn es gesetzt wurde).

Neben den StandardCopyOptions existiert noch die LinkOption, die festlegt, ob Links nicht gefolgt werden soll.

Hinter dem Interface FileAttributeView sind die Filesystem-spezifischen Attribute (für read/update) zu finden. Die üblichen, allgemein verfügbaren File-Attribute sind in BasicFileAttributeView zusammengefasst.

Streams mit NIO.2
Um den File-Inhalt als Stream<String> zu erhalten, kann die Methode lines(...) verwendet werden bei der optional das Charset gesetzt werden kann (Standard: UTF-8).
Mittels list(Path) wird lazy ein Stream<Path> erzeugt, dabei wird nicht rekursiv operiert.
Mittels walk(...) wird lazy ein Stream<Path> erzeugt, der rekursiv operiert (depth-first). Per Default wird symbolischen Links nicht gefolgt, was sich per FileVisitOption ändern lässt.
Die find(...)-Methode arbeitet grundsätzlich wie walk(...) mit gesetzter Verschachtelungstiefe, aber hier gibt es die Möglichkeit direkt einen Filter in Form eines BiPredicate<Path, BasicFileAttributes> mitzugeben. Grundsätzlich könnte man das auch mit walk(...) und nachgelagerten Filtern lösen. Dies wäre aber deutlich weniger effizient.