Input/Output Streams

minzee

Bekanntes Mitglied
Hi :)

Mich verwirrt ein Buch etwas. Es geht um Streams und Sockets.

Java:
FileOutputStream fout = new FileOutputStream("x.y");
BufferedOutputStream bout = new BufferedOutputStream(fout);
DataOutputStream dout = new DataOutputStream(bout);
dout.writeln(4711);
In dem Buch heißt es, dass die Bufferung bout zwischen fout und dout reingehört. Hier passiert folgendes: int-Wert einlesen -> konvertieren -> buffern -> ausgeben (in Datei speichern)

Auf der nächsten Seite im Buch steht aber folgendes:
Java:
Socket s = ...
OutputStream os = s.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write("Hallo Welt");
Hier passiert folgendes: string einlesen -> buffern -> konvertieren -> ausgeben (via Socket an Gegenstelle übertragen)

Jetzt haben plötzlich buffern und konvertieren die Plätze getauscht.

Ist das doch komplett egal, was man in welcher Reihenfolge macht?
 
Zuletzt bearbeitet:

lawila

Gesperrter Benutzer
nein, ist es nicht

buffering wird in der regel beim lesen genutzt ... beim schreiben wenn überhaupt dann nur bei file-io um die platte zu schonen

der grund warum hier die plätze getauscht werden ist einfach das beim file-example auf den nakten file-stream erstmal der buffer gelegt wird um wie gesagt bei häufigen schnell kleinen schreib-operationen die zugriffe zu buffern um die platte zu schonen da die daten so dann erst gesammelt und dann in einem rutsch auf die platte geschrieben werden können

was dann da noch oben drauf kommt (in dem fall ein DataOutputStream) ist völlig egal



beim socket-example macht die bufferung dann schon mal überhaupt gar keinen sinn mehr

man hat den socket, darauf den output-stream und darauf einen writer kleben
jedoch will man eigentlich bei einer socket-kommunikation schnellst-mögliche verarbeitung, wo hier das buffering genau das gegenteil bewirkt

außerdem : durch den sog. TCP-Nagle-Algorithmus sorgt die TCP-implementierung des OS für die nötige (oder meiner meinung nach eigentlich überflüssige) bufferung um halt nicht sinnfrei packete senden zu müssen die vielleicht ein oder zwei bytes nutzdaten enthalten und sonst nur aus header und padding bestehen (hier wirkt der Nagle-algo entgegen in dem er zumindest soweit die daten cachet bis die mindest-größe des TCP-paketes erreicht ist)

zusätzliches buffering auf seiten java macht IMO zumindest in diesem konkreten beispiel absolut gar keinen sinn
 

minzee

Bekanntes Mitglied
Wennst selbst bufferst, kannst auch selbst bestimmen, wann das Versenden der Daten starten soll. Ob die Daten dann fürs Versenden zerstückelt werden, ist dann Sache von TCP.

Bufferst aber nicht selbst und überlässt alles TCP, werden die Daten halt irgendwann übertragen.

So hab ich das verstanden. Ist das richtig so?
 

lawila

Gesperrter Benutzer
nur teilweise richtig ... das hängt nämlich von der buffer-größe ab
ist diese erreicht wird der buffer automatisch geflusht (was bei korrekter implementierung einen kaskaden-effekt zur folge hat und sich bis zum native des socket-streams durchzieht)

wie gesagt : ich persönlich find es sinnfrei irgendwas was über einen tcp-stream rausgehen soll noch mal extra zu buffern

entweder reicht mir halt das auto-buffern vom tcp-stack und ich call halt flush() ... oder ich nehm den Nagle-algo komplett raus und hab damit (das von mir erwünschte) gar kein buffering mehr

warum ich absichtlich daten die am ende eh über den stream gehen erst noch in nem buffer zurückhalten soll ... vor allem wenn mein ziel ja die "schnellstmögliche kommunikation" ist ... sorry, fällt mir nichts weiter zu ein



aber : es gibt wie gesagt anwendungsbeispiele wo buffering IMO durch aus sinn macht

ganz großer punkt z.b. file-io auf der platte
hier wähle ich einen möglichst großen buffer (in der regel ein vielfaches der cluster-größe) um halt größere daten in einem rutsch sequentiell von der platte zu lesen ... und auch beim schreiben dann wieder un-fragmentiert rauszuschreiben

oder z.b. auch bei RS232, weil hier kommt es dann z.b. darauf an auf das "ready" vom gegenüber zu warten
denn bei RS232 kann man zwar durch aus daten auf den kanal schreiben ... bringt einem aber nichts wenn die gegenstelle noch nicht bereit dazu ist diese dann auch zu lesen und zu verarbeiten ... dann schreibt man nämlich in dem sinne ins "nichts" und die daten sind dann erstmal weg
macht vor allem beim de-buggen einen riesen spaß sowas rauszufrimeln

wo es bei einer socket-verbindung sinn macht zu buffern ist beim inputstream
sinn kann hier sein das man z.b. nicht zeichen-weise sondern zeilen-weise einlesen möchte (Reader statt InputStream)
nun ist es wichtig erstmal soweit daten vom Stream zu lesen bis man ein \n findet an dem dann gesplittet werden kann
oder auch bei allem anderen was block-weise arbeitet (z.b. komprimierung und verschlüsselung) ... denn mit einzelnen bytes kann hier nicht gearbeitet werden, es muss immer mindestens der nächste block vollständig sein
 

lawila

Gesperrter Benutzer
nein ... ein flush() ist grundsätzlich immer möglich da von OutputStream vorgeschrieben

flush() wird in der regel so implementiert das die interne verarbeitung bis zum block gepadded und dann abgeschlossen, die daten auf den gekapselten stream geschrieben und anschließend auf diesem auch flush() gecallt wird bis das ganze in irgend nem native flush0() endet
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Parallel Streams Java Basics - Anfänger-Themen 18
W Streams in Java und was bedeutet meine Konsolen-Ausgabe? Java Basics - Anfänger-Themen 4
M Streams Java Basics - Anfänger-Themen 34
M Streams filter Java Basics - Anfänger-Themen 15
M generate Methode für Streams Java Basics - Anfänger-Themen 6
berserkerdq2 Java streams, wann nutze ich ::, also 2x Doppelpuntk bei Streams? Java Basics - Anfänger-Themen 5
B Produkt eines double - streams Java Basics - Anfänger-Themen 3
berserkerdq2 IO Streams logfile erstellen und Sachen schreiben wie? Java Basics - Anfänger-Themen 2
D Verwirrung bei Streams aus primitiven Arrays Java Basics - Anfänger-Themen 2
B Collections Streams - Hilfestellung bei komplexer Struktur Java Basics - Anfänger-Themen 9
S Streams - Abfrage absteigend sortieren Java Basics - Anfänger-Themen 11
S Streams - kleinstes Element finden Java Basics - Anfänger-Themen 4
J String Array zu Map<Character, List<Character>> mit Streams Java Basics - Anfänger-Themen 1
Kirby.exe Fehlende Int Werte aus Array mit streams finden Java Basics - Anfänger-Themen 19
W Eclipse Autoformatierung für Streams ändern ? Java Basics - Anfänger-Themen 1
S Lambda Ausdrücke Streams Java Basics - Anfänger-Themen 6
I Streams Java Basics - Anfänger-Themen 12
N Frage zu Streams Java Basics - Anfänger-Themen 3
U Input/Output Unterschiede Streams Java Basics - Anfänger-Themen 2
X Streams und Ausgabe - lässt sich das einfacher schreiben oder schöner schreiben? Java Basics - Anfänger-Themen 5
C system.out.printf mit streams benutzen Java Basics - Anfänger-Themen 7
C Methoden Sortieren mit Streams: Auf- und absteigend Java Basics - Anfänger-Themen 2
O Streams und die flush Methode Java Basics - Anfänger-Themen 3
P InputStream eines Musik-Streams abspielen Java Basics - Anfänger-Themen 2
T Klassen wie funktionieren Streams, warum bekomme ich int zurück? Java Basics - Anfänger-Themen 2
J Java 8 Streams - Frage zu "reduce" Java Basics - Anfänger-Themen 6
Sogomn Input/Output Reader, Writer und Streams Java Basics - Anfänger-Themen 6
T Fehler mit Streams! Java Basics - Anfänger-Themen 2
T Input/Output Object Streams Java Basics - Anfänger-Themen 6
J Per I/O Streams in LinkedList oder ArrayList schreiben/lesen Java Basics - Anfänger-Themen 6
I Java Streams Java Basics - Anfänger-Themen 6
R Streams for runaways Java Basics - Anfänger-Themen 5
RySa Input/Output Datei kann nicht gelöscht werden, obwohl Streams geschlossen sind. Java Basics - Anfänger-Themen 2
D Input/Output streams und readLine() Java Basics - Anfänger-Themen 3
firefexx Input/Output close() bei mehreren Streams Java Basics - Anfänger-Themen 5
M Frage zu Streams Java Basics - Anfänger-Themen 9
C try finally - Streams schließen Java Basics - Anfänger-Themen 7
M Streams und Sockets Java Basics - Anfänger-Themen 3
M file löschen, streams evtl noch offen Java Basics - Anfänger-Themen 7
G Character-orientierte File-Streams mit der Klasse FileReader Java Basics - Anfänger-Themen 5
S Piped Streams / Threads Java Basics - Anfänger-Themen 6
H Frage zu Byte-Streams Java Basics - Anfänger-Themen 2
P Streams mit Sockets Java Basics - Anfänger-Themen 7
V Performance Lesen und Schreiben aus/in Streams Java Basics - Anfänger-Themen 4
C RandomAccessFile vs. Streams Java Basics - Anfänger-Themen 5
M Probleme mit den Streams Java Basics - Anfänger-Themen 2
G streams schließen Java Basics - Anfänger-Themen 2
P Fragen zu STreams Java Basics - Anfänger-Themen 5
M Streams Java Basics - Anfänger-Themen 4
H Streams etc. erster Versuch Zeilen aus einer Datei zu lesen Java Basics - Anfänger-Themen 6
? Streams Java Basics - Anfänger-Themen 2
R RandomAccessFile mit anderen Streams verbinden Java Basics - Anfänger-Themen 5
G Rekursionsaufgabe mit Streams Java Basics - Anfänger-Themen 5
J Problem mit Streams Java Basics - Anfänger-Themen 15
L Streams und Reader/Writer Java Basics - Anfänger-Themen 8
K Frage zu SdtOut streams bzw. Socket Programmierung Java Basics - Anfänger-Themen 3
M Streams, read and write Java Basics - Anfänger-Themen 2
M Streams Java Basics - Anfänger-Themen 2
B Streams wollen scheinbar nicht schließen Java Basics - Anfänger-Themen 6
S Umwandlung eines Character-Streams in ein Image Java Basics - Anfänger-Themen 17
E Probleme mit Streams Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben