19 Einführung in Dateien und Datenströme
»Schlagfertigkeit ist jede Antwort, die so klug ist,
dass der Zuhörer wünscht, er hätte sie gegeben.«
– Elbert Green Hubbard (1856–1915)
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[ 263 ](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.
19.1 Alte und neue Welt in java.io und java.nio
Java bringt schon seit Urzeiten Klassen und Methoden zur Dateiverarbeitung mit, und das java.io-Paket gibt es schon seit Java 1.0. In späteren Java-Versionen kamen neue Typen und neue Pakete hinzu.
19.1.1 java.io-Paket mit File-Klasse
Das java.io-Paket deklariert eine zentrale Klasse File, die für eine Datei oder ein Verzeichnis auf dem aktuellen Dateisystem steht. File bietet zahlreiche dateiorientierte Operationen, wie Dateien anlegen, löschen, umbenennen, Verzeichnisse auflisten usw.
File-Probleme
Bei File konzentriert sich alles auf eine Klasse, und sie kann alltägliche Probleme nicht wirklich lösen:
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.
19.1.2 NIO.2 und das java.nio-Paket
Alternativ zum Paket java.io mit der Klasse File gibt es das Paket java.nio.file mit weiteren Typen, wie Path, Paths, Files und FileSystem.
[»] Geschichte
Die File-Probleme waren lange bekannt, und so begannen 2003 die Arbeiten an dem JSR 203, »More New I/O APIs for the Java™ Platform (›NIO.2‹)«. Doch erst Mitte 2011, in Java 7, kam es zum großen Wurf.
19.1.3 java.io.File oder java.nio.*-Typen?
Die File-Klasse ist heutzutage an den wenigsten Stellen nötig, und zwar eigentlich nur aus zwei Gründen:
Alte APIs erwarten als Parameter File-Objekte. Dafür gibt es Brücken zwischen den APIs, doch ersetzen die neuen NIO.2-Typen die File-Klasse im Grunde vollständig, und langfristig sollten File-Objekt nicht mehr erwartet werden.
File-Objekte sind nötig, wenn wirklich Dateien auf dem eigenen Datensystem repräsentiert werden sollen und nicht unabhängig vom Dateisystem. Ein gutes Beispiel ist Desktop mit der open(File)-Methode.