# Verfügbarkeit von Daten in Streams



## eumeldeumel (28. Dez 2012)

Hi,

ich hab eine Frage zur Funktionsweise von Streams.

Also mein Problem ist, dass ich Objekte mit variabler Größe mit einem Stream übermitteln will. Ich frage mich jetzt, ob, wenn ich ein byte[] in meinen Stream schreibe und gleichzeitig beim Client mit read() auf verfügbare Daten warte, dann der Client das Objekt stückweise bekommt.
Also "schiebt" der Sender einfach die Daten in die Röhre und der Empfänger der auf die read()-Methode wartet bekommt sie häppchenweise, oder schreibt der Sender in den Stream, und erst wenn er fertig ist gibt mir die read()-Methode das ganze Objekt aus?

Ich hoffe ich hab einigermaßen verständlich ausgedrückt wo ich hänge 

Gruß
R.


----------



## Bizarrus (28. Dez 2012)

Dien Antwort würde *availableBytes() *heissen.


----------



## tröööt (28. Dez 2012)

wenn überhaupt heißt die methode InputStream.available() ... und diese methode gibt nur die menge an bytes zurück die OHNE blockieren durch read() gelesen werden können ...
sie gibt also keinerlei auskunft über irgendwelche größen und längen ... sondern dient lediglich als anhaltspunkt wie viel man beim nächsten call von read() aus dem stream lesen kann ohne das diese methode blockiert ...
wobei es jedoch nur ein richtwert ist ... und entweder genau gleich der menge an verfügbaren bytes ist oder kleiner .. aber niemals größer (siehe API-doc)

da TO jetzt aber von Objekten redet muss man auf den InputStream noch mindestens einen ObjectInputStream aufsetzen ...
auch diese klasse bietet nur die methode "available()" mit dem oben beschriebenen verhalten ...

eine methode "availableBytes()" gibt es also erstmal überhaupt nicht

wenn man nun auf einen ObjectInputStream readObject() callt wird intern auch auf wieder auf read() zugegriffen und natürlich die daten "stückchenweise" gelesen und dann zu einem objekt wieder zusammen gesetzt ...

ObjectInputStream.readObject() returned also erst wenn ALLES gelesen und daraus wieder ein gültiges, vollständiges objekt erzeugt wurde ...

oder habe ich an der frage jetzt irgendwas missverstanden ... weil "Objekte" und "byte[]" passt irgendwie nicht zusammen ...

grundsätzlich ist es aber so das natürlich nur maximal das gelesen werden kann was im buffer des stacks des OS liegt ... und wenn da halt noch nicht genug daten drin sind damit read() ohne blockieren returnen kann wird halt so lange gewartet bis entsprechend so viele daten gelesen werden können bis der buffer gefüllt ist ...

dabei ist es völlig gleich was auf der OutputStream.write() seite passiert ...


wenn diese antwort jetzt nicht klärend war bitte die frage neu formulieren


----------



## eumeldeumel (29. Dez 2012)

danke für die antworten 
ich hab den tag über heute meine klassen entsprechend umgestellt ums zu testen 
Mein Client schreibt ein serialisiertes Objekt in den Stream und der Server prüft in ner schleife ob available() > 0 ist. wenn ja, dann les ich alle auf einen schlag aus und deserialisiere sie wieder.
bis jetzt kommen alle objekte ganz an.
ich werds noch mit größeren objekten testen, aber bis jetzt siehts gut aus 

btw., es ging darum eine kleine klassenbibliothek zu schreiben die mir server-client kommunikation für spätere projekte abnimmt 

ich hatte einfach sorge, dass wenn ich ein großes serialisiertes objekt in den stream schreib, dann meine empfangsmethode bei der hälfte anschlägt und ich beim deserialisieren ne exception bekomme 

danke für die antworten


----------



## tröööt (30. Dez 2012)

wie gesagt : wenn es um objekt-serialisierung geht dann nutze einfach Object*Stream ... der kümmert sich um alles ... da brauchts kein InputStream.available() ... zu mal das intern eh genutzt wird ... das muss man nicht doppelt machen


----------

