6Dateien, Verzeichnisse und Dateizugriffe
»Schlagersänger sind junge Männer, die bei Stromausfall keine Sänger mehr sind.«
– Danny Kaye (1913–1987)
Computer sind für uns so nützlich, weil sie Daten bearbeiten. Der Bearbeitungszyklus beginnt mit dem Einlesen der Daten, umfasst das Verarbeiten und endet mit der Ausgabe der Daten. In der deutschsprachigen Informatikliteratur wird deswegen auch vom EVA-Prinzip der Datenverarbeitungsanlagen gesprochen. In frühen EDV-Zeiten wurde die Eingabe vom Systemoperator auf Lochkarten gestanzt. Glücklicherweise sind diese Zeiten vorbei. Heutzutage speichern wir unsere Daten in Dateien (engl. files[ 69 ](Das englische Wort »file« geht auf das lateinische Wort »filum« zurück. Dies bezeichnete früher eine auf Draht aufgereihte Sammlung von Schriftstücken.)) und Datenbanken ab. Es ist wichtig anzumerken, dass eine Datei nur in ihrem Kontext interessant ist, andernfalls beinhaltet sie für uns keine Information – die Sichtweise auf eine Datei ist demnach wichtig. Auch ein Programm besteht aus Daten und wird oft in Form einer Datei repräsentiert.
6.1Alte und neue Welt in java.io und java.nio
6.1.1java.io-Paket mit File-Klasse
Das java.io-Paket gibt es schon seit Java 1.0. Es deklariert eine zentrale Klasse File, und diese bietet zahlreiche dateiorientierte Operationen. Dazu zählen Möglichkeiten, Dateien anzulegen, zu löschen, umzubenennen und sie in Verzeichnissen zu strukturieren. Allerdings konzentriert sich alles auf eine Klasse, und sie kann alltägliche Probleme nicht wirklich lösen:
Wie lässt sich eine Datei einfach und schnell kopieren?
Wie lässt sich eine Datei verschieben, wobei die Semantik auf unterschiedlichen Plattformen immer gleich ist?
Wie lässt sich auf eine Änderung im Dateisystem reagieren, sodass uns ein Callback informiert, sobald sich eine Datei verändert hat?
Wie lässt sich einfach ein Verzeichnis rekursiv ablaufen?
Wie lässt sich eine symbolische Verknüpfung anlegen und verfolgen?
Die File-Klasse wurde immer mehr zum Sammelbecken für alle möglichen Anfragemethoden wie Lesbarkeit, Änderungsdatum usw. Ein Problem ist dabei, dass gewisse Dinge nicht wirklich auf jedem System identisch sind – etwa die Dateirechte.
Wie lässt sich realisieren, dass die File-Operationen abstrahiert werden und nicht nur auf dem lokalen Dateisystem basieren? Wünschenswert ist eine Abstraktion, sodass die gleiche API auch ein virtuelles Dateisystem im Hauptspeicher, entfernte Dateisysteme wie FTP oder ein Repository anspricht.
6.1.2NIO.2 und java.nio-Paket
Diese Probleme wurden für Java 7 angegangen und in der JSR-203, »More New I/O APIs for the Java™ Platform ("NIO.2")«, spezifiziert. Die JSR begann schon 2003, und so waren die Erwartungen der Java-Community groß, dass sie nicht so lange warten müssten. Aber erst in Java 7 kam es zum großen Wurf. Das macht die »alte« File-Klasse eigentlich überflüssig, aber vermutlich scheut sich Oracle davor, ein @Deprecated an die Klasse zu setzen, denn sonst würden plötzlich riesige Mengen Quellcode in vielen Programmen markiert.
Die neuen Typen befinden sich im Gegensatz zu File, das im java.io-Paket liegt, im Paket java. nio.file. Es gibt zwar Brücken zwischen den APIs, doch ersetzen die neuen NIO.2-Typen die File-Klasse vollständig. Wir setzen daher die aktuellen und leistungsfähigen Typen in den Vordergrund und schieben die nunmehr uninteressante Klasse File nach hinten.