12.6 Daten filtern durch FilterInputStream und
FilterOutputStream
 
Die über irgendwelche Kanäle den Benutzer erreichenden Daten können durch zwei spezielle Klassen gefiltert werden: FilterInputStream und FilterOutputStream. Eine Filter-Klasse überschreibt alle Methoden von InputStream und OutputStream und ersetzt diese durch neue Methoden mit erweiterter Funktionalität. Unterklassen von FilterInputStream und FilterOutputStream zeigt die folgende Tabelle.
FilterInputStream
|
FilterOutputStream
|
Anwendung
|
BufferedInputStream
|
BufferedOutputStream
|
Daten puffern
|
CheckedInputStream
|
CheckedOutputStream
|
Checksumme verwalten
|
DataInputStream
|
DataOutputStream
|
Primitive Datentypen im Strom ermöglichen
|
DigestInputStream
|
DigestOutputStream
|
Digest (Checksumme) mitberechnen
|
InflaterInputStream
|
DeflaterOutputStream
|
Kompression von Daten
|
LineNumberInputStream
|
|
Mitzählen von Zeilen
|
PushbackInputStream
|
|
Daten in den Lesestrom zurückgelegt
|
javax.crypto.CipherOutputStream
|
|
Daten verschlüsseln
|
Die Klasse LineNumberInputStream sollte nicht mehr verwendet werden, da sie veraltet ist (dafür gibt es jedoch LineNumberReader als Reader-Klasse). Die besondere Unterklasse PrintStream vom FilterOutputStream wollen wir separat behandeln.
 Hier klicken, um das Bild zu Vergrößern
Am UML-Diagramm fällt besonders auf, dass jeder Filter zum einen selbst ein Stream ist und zum anderen einen Stream verwaltet. Damit nimmt er Daten entgegen und leitet sie gleich weiter. Das ist ein bekanntes Design-Pattern und nennt sich Dekorator.
12.6.1 DataOutputStream/DataInputStream
 
Während der OutputStream nur einzelne Byte bzw. Byte-Felder schreibt und der InputStream aus einer Eingabe Byte lesen kann, erweiterten die Klassen DataOutputStream und DataInputStream diese Schreib-/und Lesefähigkeit um primitive Datentypen. Die Vorgaben bekommen sie aus DataOutput und DataInput, die wir schon bei RandomAccessFile sahen. Wir wollen uns nur mit einer Funktion näher auseinandersetzen: writeUTF() und readUTF().
Die UTF-8 Kodierung
Java verwaltet Unicode-Zeichen über den Datentyp char, der 16 Bit lang ist. In unseren Breiten stammen die meisten Zeichen jedoch aus dem herkömmlichen 8 Bit des Latin-1 Zeichensatzes. Werden die Zeichen als Unicode (also zwei Byte) versendet werden, würde der 16-Bit Datenstrom zur Hälfte aus Nullen bestehen. Aus diesem Grund gibt es eine alternative Kodierung, die jedes 16-Bit Unicodezeichen platzsparend schreibt und in Abhängigkeit von der Belegung 1, 2 oder 3 Byte lang ist. Die Codierung richtet sich nach der Belegung der Bit wie folgt:
|
\u0000-\u007F: Die Zeichen werden direkt mit einem Byte geschrieben. Da das die häufigsten Zeichen sind, werden die Dateigrößen nicht länger. |
|
\u0080-\u07FF: Die Zeichen werden mit 2 Byte codiert. |
|
\u0800-\uFFFF: Die Zeichen werden mit 3 Byte codiert. |
|