skip to content

Streams

Streams sind abstrakte Verbindungen eines Programms nach außen, d.h. alle Ein- und Ausgabevorgänge (I/O) werden mit Streams abgewickelt. Einen Stream kann man sich als eine Art Pipeline vorstellen, durch die Daten zwischen dem Programm und den I/O-Medien fließen. Streams sind in der Regel unidirektional (Ausnahme: RandomAccessFile), d.h. man kann mit ihnen entweder lesen oder schreiben, aber nicht beides zugleich. Deswegen gibt es zu jeder Verbindung zwei Klassen (eine, die für das Schreiben, eine andere, die für das Lesen verantwortlich ist). Auch in sämtlichen Programmen des Kurses finden sich jeweils zwei selbstdefinierte Objekte (gewöhnlich bezeichnet mit in und out), von denen eines für die Eingabe, das andere für die Ausgabe zuständig ist. Das Stream-Konzept ist in Java vollständig objektorientiert umgesetzt, wie im Weiteren noch gezeigt wird. Die benötigten und vom SDK/JDK mitgelieferten Klassen befinden sich allesamt im Paket java.io, deren Dokumentation sich u.A. hier begutachten läßt. Seit dem JDK 1.1 existieren in Java neben den Byte-Streams (die lediglich 8-Bit-Einheiten zwischen Sender und Empfänger transportieren können) auch Character-Streams (16 Bit breit), die die Ein-/Ausgabe für Unicode-Zeichen vereinfachen.

 

Standard-Datenströme aus der Klasse System

Die Klasse System aus dem Packet java.lang stellt statische Variablen für die Ein-/Ausgabe, sowie Fehlermeldungen zur Verfügung, die man über die Aufrufe

  • System.in (für den Standard-Eingabestrom über die Tastatur)
  • System.out (für den Standard-Ausgabestrom in die Konsole)
  • Sytem.err (für Fehlermeldungen in die Konsole)

nutzen kann. Die Standard-Datenströme sind allesamt Byte-Streams und nutzen die Klassen java.io.PrintStream und java.io.InputStream. Sie bieten insgesamt leider nur wenig Komfort und können nur die Standard Ein-/Ausgabegeräte nutzen. Mit Hilfe von Readern und Writern lässt sich die Ein- und Ausgabe in Java jedoch vereinfachen.

 

Spezielle Datenströme aus dem Package java.io

OutputStream und InputStream sind abstrakte Oberklassen, die das Verhalten für sequenzielle Ein- und Ausgabeströme definieren. In den Unterklassen werden spezielle Unterklassen definiert, von denen hier nur einige aufgeführt werden können:

  • Dateiströme: FileInputStream und FileOutputStream; Lesen von bzw. schreiben auf eine Datei (File), die ihnen als Parameter übergeben wird (vgl. Beispielprogramme)
  • Stringströme: StringReader und StringWriter: Lesen von bzw. schreiben auf einen übergebenen String 
  • Filterströme: BufferedReader, BufferedWriter: Lesen von bzw. schreiben zunächst auf eine Zwischenrepräsentation (einen Puffer) und fassen damit elementare Einheiten zu größeren Blöcken zusammen, was die Performance beim Lesevorgang erhöht (vgl. Beispielprogramme). Außerdem erlauben sie, dass auf vollständige Textzeilen im Puffer zugegriffen werden kann, weshalb sie immer benutzt werden sollten, wenn man zeilenweise ein-/auslesen möchte (mittels der Methode readLine(), die es bei ungepufferten Einleseströmen nicht gibt).

 

Weitere Klassen aus java.io

  • RandomAccessFile: Erlaubt Lese- wie Schreiboptionen auf ein übergebenes File. Verhält sich dabei wie ein byte-Array, auf dem mit Hilfe eines Zeigers navigiert werden kann.
  • File: Datei-Objekt, das von den Dateiströmen verlangt wird. Die Initialisierung erfolgt durch einen Konstruktoraufruf an die Klasse File unter Angabe des Pfades als Parameter.
  • StreamTokenizer: Unterteilt den InputStream in Tokens, die einzeln und in Reihenfolge eingelesen werden können.
*