Die Streams, wie sie im letzten Abschnitt verwendet wurden, sind alle Byte-orientiert,
d. h. als kleinste Ein- und Ausgabeeinheit wird ein Byte verwendet.
Dadurch können Probleme enstehen, wenn in einer Java-Anwendung Text verarbeitet wird.
In Java werden Strings intern im Unicode-Format gespeichert, wodurch
ein Zeichen 16 Bit (2 Byte) belegt.
Auf
verschiedenen Plattformen werden unterschiedliche Zeichensätze
für die Kodierung von Text verwendet.
Ein solcher Zeichensatz besitzt sehr oft 256 Einträge und ordnet
jedem Eintrag ein Zeichen zu. Ein Zeichen wird also durch einen Index innerhalb
eines Zeichensatzes bestimmt. Dieser Index kann bei 256 Zeichen
durch genau ein Byte dargestellt werden.
Zwischen den einzelnen Zeichensätzen gibt es folgende
Unterschiede:
- es können unterschiedliche Zeichen in den jeweiligen Zeichensätzen enthalten sein.
- ein Zeichen kann sich in zwei Zeichensätzen an unterschiedlichen Index-Positionen befinden.
Beim Einlesen und Speichern von Text mit einer Java-Anwendung ist deshalb immer
eine Konvertierung notwendig. Jedes Zeichen muss beim Laden bzw. bei der Eingabe in Unicode konvertiert werden. Beim Speichern bzw. bei der Ausgabe muss eine Konvertierung von Unicode
in den Zeichensatz der entsprechenden Plattform erfolgen. Im JDK 1.0
wurde diese Konvertierung nicht richtig ausgeführt.
Bei der Ausgabe wurde einfach das höhere Byte des Unicode-Zeichens
ohne Berücksichtigung des Zeichensatzes der Plattform verworfen.
Dies entspricht einer Konvertierung in iso-latin-1.
Deshalb wurden mit dem
JDK 1.1 so genannte Reader- und Writer-Klassen
eingeführt. Sie sind genauso wie alle anderen Streams
im Paket java.io enthalten. Die Klasse Reader
stellt das Analogon zum InputStream dar, die Klasse
Writer zum OutputStream.
Im Paket java.io sind ebenfalls viele weitere Klassen
definiert, die von Reader- und Writer abgeleitet sind und
dem Programmierer eine einfachere Ein- und Ausgabe ermöglichen. Dies ist
auch notwendig, da Reader und Writer genau wie InputStream
und OutputStream, nur elementare Ein- und Ausgabe-Methoden zur Verfügung
stellen, deren Benutzung für den Programmierer recht mühsam ist.
Im Gegensatz zu InputStream
und OutputStream, die die Basis für die Ein- und
Ausgabe in Java 1.0 darstellen, arbeiten Reader und Writer nicht auf
Byte-Basis, sondern besitzen als kleinste Ein- und
Ausgabeeinheit ein 16-Bit-Unicode-Zeichen.
Die Methoden der Reader- und Writer-Klassen
sind meist identisch mit den Methoden der Klassen
InputStream und OutputStream, mit dem
Unterschied, dass die Parameter und Ergebnistypen
nicht vom Typ byte, sondern vom Typ char sind.
In
der Funktionalität sind die neuen Reader- und Writer-Klassen
den Streams in Java 1.0 allerdings ebenbürtig. So wurde
für fast jeden InputStream, der im Paket java.io
enthalten ist, eine entsprechende Reader-Klasse
hinzugefügt. Analoges gilt für die OutputStreams und
die Writer-Klassen.
Neben den neuen Reader- und Writer-Klassen können die
herkömmlichen Streams weiter verwendet werden.
Das ist auch sinnvoll, da sprachspezifische Zeichendarstellung nur bei
Text eine Rolle spielt. Werden z. B. binäre Daten verarbeitet,
sind sicherlich die Byte-basierten Streams vorzuziehen.
Ein anderer Grund für die weitere Verwendungsmöglichkeit der Byte-orientierten
Streams ist die Abwärtskompatibilität
zum JDK 1.0.
Die Standard-Streams, wie sie im letzten Abschnitt beschrieben wurden, sind
von dieser eben angesprochenen Änderung nicht betroffen. Sie arbeiten nach
wie vor auf Byte-Basis.
Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.