12.3 Stream-Klassen und Reader/Writer
 
Alle Datenströme sind als Klassen repräsentiert, die im Paket java.io gesammelt sind. In den ersten Java-Versionen konnten nur Primitive beziehungsweise Bytes und Byte-Arrays geschrieben und gelesen werden. Seit Java 1.1 gibt es für Byteströme und Unicodezeichen-Ströme getrennte Klassen. Das macht aus mehreren Gründen Sinn: Das Einlesen von Unicode-Dateien ist vereinfacht, und Daten müssen nicht auf festgelegten Zeichensätzen arbeiten, ja wir bekommen vom Konvertieren von Unicode nach Bytes überhaupt nichts mit.
12.3.1 Die abstrakten Basisklassen
 
Die komplexen Eingabeklassen wie FileInputStream, ByteArrayOutputStream oder BufferedWriter basieren auf abstrakten Oberklassen. Im Allgemeinen können wir vier Kategorien bilden: Klassen zur Ein-/Ausgabe von Bytes (oder Byte-Arrays) und Klassen zur Ein-/Ausgabe von Unicode-Zeichen (oder Strings). Die aufgeführten Klassen geben Methoden vor, die für jede implementierende Klasse von Interesse sind.
Basisklasse für
|
Bytes (oder Byte-Arrays)
|
Zeichen (oder Zeichen-Arrays)
|
Eingabe
|
InputStream
|
Reader
|
Ausgabe
|
OutputStream
|
Writer
|
12.3.2 Übersicht über Ein-/Ausgabeklassen
 
Während die abstrakten Basisklassen von keiner konkreten Datenquelle lesen oder in keine Ressource schreiben, implementieren die Unterklassen eine ganz bestimmte Strategie für eine Ressource. So weiß zum Beispiel ein FileWriter, wie für Dateien die abstrakte Klasse Writer zu implementieren ist, also wie Unicode-Zeichen in eine Datei geschrieben werden können.
Die folgenden Tabellen geben eine Übersicht über die wichtigsten Eingabe- und Ausgabe-Klassen.
Tabelle 12.1
Wichtige Eingabeklassen
Byte-Stream-Klasse für
die Eingabe
|
Zeichen-Stream-Klasse
für die Eingabe
|
Beschreibung
|
InputStream
|
Reader
|
Abstrakte Klasse für Zeicheneingabe und Byte-Arrays
|
BufferedInputStream
|
BufferedReader
|
Puffert die Eingabe
|
LineNumberInputStream
|
LineNumberReader
|
Merkt sich Zeilennummern beim Lesen
|
ByteArrayInputStream
|
CharArrayReader
|
Liest Zeichen-Arrays oder Byte-Arrays
|
(keine Entsprechung)
|
InputStreamReader
|
Wandelt Byte-Stream in Zeichen-Stream um, Bindeglied zwischen Bytes und Zeichen
|
DataInputStream
|
(keine Entsprechung)
|
Liest Primitive und auch UTF-8
|
FilterInputStream
|
FilterReader
|
Abstrakte Klassse für gefilterte Eingabe
|
PushbackInputStream
|
PushbackReader
|
Erlaubt gelesene Zeichen wieder in den Stream zu geben
|
PipedInputStream
|
PipedReader
|
Liest von einem
PipedWriter oder
PipedOutputStream
|
StringBufferInputStream unter 1.1 nicht mehr erwünscht
|
StringReader
|
Liest aus Strings
|
SequenceInputStream
|
(keine Entsprechung)
|
Verbindet zwei andere InputStreams
|
TelepathicInputStream
|
TelepathicWriter
|
Überträgt Daten mittels Telepathie5
|
Tabelle 12.2
Wichtige Ausgabeklassen
Byte-Stream-Klasse für die
Ausgabe
|
Zeichen-Stream Klasse für die Ausgabe
|
Beschreibung
|
OutputStream
|
Writer
|
Abstrakte Klasse für Zeichenausgabe oder Byte-Ausgabe
|
BufferedOutputStream
|
BufferedWriter
|
Ausgabe des Puffers, nutzt passendes Zeilenendezeichen
|
ByteArrayOutputStream
|
CharArrayWriter
|
Schreibt Arrays
|
DataOutputStream
|
(kein Entsprechung)
|
Schreibt Primitive und auch UTF-8
|
(keine Entsprechung)
|
OutputStreamWriter
|
Übersetzt Zeichen-Stream in Byte-Stream
|
FileOutputStream
|
FileWriter
|
Schreibt in eine Datei
|
PrintStream
|
PrintWriter
|
Schreibt Werte (oder Objekte)
|
PipedOutputStream
|
PipedWriter
|
Schreibt in eine Pipe
|
(keine)
|
StringWriter
|
Schreibt in einen String
|
|