Um sich von der Klasse java.io.File zu lösen und in Richtung Path zu migrieren, ist Handarbeit angesagt. Zunächst gilt es, alle Stellen zu finden, die im Workspace oder Projekt die Klasse File referenzieren. Am Einfachsten ist es, eine Anweisung wie File f; in den Code zu setzen, dann zum Beispiel in Eclipse Strg+Shift+G zu aktivieren. Es folgt eine Liste aller Vorkommen. Diese Liste muss nun abgearbeitet werden und der Code auf NIO.2 konvertiert werden. Nicht immer ist es so einfach
Scanner s = new Scanner( new File(dateiname) );
in
Scanner s = new Scanner( Paths.get(dateiname) );
umzusetzen oder
new File( dateiname ).delete();
in
Files.delete( Paths.get( dateiname ) );
Eine andere Stelle, an der Konvertierungen möglich sind, betreffen FileReader und FileWriter. Diese Klassen sind gefährlich, weil sie standardmäßig die im System voreingestellte Kodierung verwenden. Eine Kodierung wie UTF-8 im Konstruktor explizit vorzugeben ist jedoch nicht möglich. NIO.2 bietet eine bessere Methode, um an einen Reader/Writer aus einer Datei zu kommen und Entwickler werden gezwungen, die Kodierung immer sichtbar anzugeben.
Deklaration |
Klassisch |
Mit NIO.2 |
Reader r = |
new FileReader(f); |
Files.newBufferedReader(Paths.get(f), StandardCharsets.ISO_8859_1); |
Writer w = |
new FileWriter(f); |
Files.newBufferedWriter(Paths.get(f), StandardCharsets.ISO_8859_1); |
Beziehen eines Dateistroms klassisch und mit NIO.2
Der Quellcode wird erst einmal länger, doch der Gewinn ist, dass die Kodierung nicht verschwindet und auch die Ein-/Ausgabe gleich gepuffert ist. Freunde der statischen Import-Anweisung komprimieren weiterhin zu Anweisungen wie
Reader r = newBufferedReader( get( f ), ISO_8859_1 );
Es ist auf den Fall Handarbeit angesagt. Eigene Blöcke, etwa zum Schreiben in Dateien können komplett zusammengestrichen werden auf einfache Methodenaufrufe wie
Files.write( Paths.get( f ), bytes );
List<String> lines = Files.readAllLines( Paths.get( f ), StandardCharsets.ISO_8859_1 );