Mal ein paar generelle Fragen zu InputStream und OutputStream

White_Fox

Top Contributor
Mahlzeit allerseits

Ich hätte mal ein paar grundlegene Fragen zu den beiden Klassen InputStream und OutputStream.
Wann ist deren Verwendung sinnvoll? Verwendung im dem Sinne, daß ich eine eigene Klasse schreibe die man mit Daten füttern und die Daten ausspucken soll.

Der Hintergrund ist, daß ich gerade eine solche Klasse schreibe und ich könnte dieser theoretisch ein Bytearray vor die Füße werfen und auch ein Bytearray ausgeben lassen. Da die Daten aber z.B. in eine Datei geschrieben werden sollen dachte ich mir, wäre die Verwendung von Streams vielleicht klüger.

Jetzt habe ich angefangen den Test zu schreiben und wollte dabei die Daten, die die Klasse liefert, wieder in die Klasse zurückschreiben. Und dabei festgestellt, daß es eine Scheißidee ist, aus einem OutputStream in einen InputStream zu schreiben. Ich meine zwar irgendwann mal in irgendeinem Tutorial/Lehrbuch gelesen zu haben das Streams ganz toll sind weil man sie einfach zusammenstöpseln kann, aber so richtig will das nicht aufgehen.
 
Zunächst einmal sind Input- und Output-Streams Abstraktionen für Datenströme. D. h. über eine einheitliche Schnittstelle kann die Ein-/Ausgabe behandelt werden, bei der das Byte der zentrale Datentyp ist. Das hat zunächst einmal den Vorteil, dass sich Ausgabeströme kombinieren lassen (analog Eingabeströme), so dass sich z. B. Pufferung oder Verschlüsselung beliebiger Datenströme durch einfache Komposition erzielen lässt.

Dadurch kann man z. B. auf der Kommandozeile die Ausgabe eines Programms umleiten. Nehmen wir mal sed an:

sed -e ${PATTERN} < input.txt > output.txt

Was hier nicht sofort deutlich wird: man hat damit eine Form der Kommunikation über verschiedene Prozesse hinweg, weil es völlig egal ist, womit input.txt und output.txt erzeugt wurden und mit welchem Tool die Dateien verarbeitet werden.

Man kann also z. B. erstmal mit sed Leerzeilen löschen und anschließend

wc -l < output.txt

ausführen, um die Zahl der Zeilen zu erhalten.

Statt über Dateien zu gehen, gibt es die Möglichkeit, eine Pipe als Kommunikationskanal zu verwenden. Ein Prozess schreibt in die Pipe, der andere Prozess liest aus der Pipe:
cat input.txt | sed -e ${PATTERN} | wc -l

Die Möglichkeit gibt es mit PipedOutputStream und PipedInputStream auch in Java, um Threads über eine Pipe kommunizieren zu lassen. Ein Thread schreibt in die PipedOutputStream, der andere liest aus der PipedInputStream.

Wenn Du keine Threads willst, kannst Du aber auch einfach erstmal in einen ByteArrayOutputStream schreiben und anschließend das byte-Array über einen ByteArrayInputStream wieder lesen.
 
Wie gesagt: entweder lässt Du in einen ByteArrayOutputStream schreiben, holst Dir das byte-Array und lässt aus dem ByteArrayInputStream lesen, oder aber Du verwendest zwei Threads und lässt einen davon in den PipedOutputStream schreiben, den anderen vom PipedInputStream lesen.
 

Zurück
Oben