Outputstreams

Lord_Aratorn

Aktives Mitglied
Hi, ich möchte Objekte mittels eines Outputstreams und eines Bytearrayoutputstreams serialisieren. Im nächsten Schritt die Streams überschreiben. Nun stellt sich mir die Frage, wie mache ich das am besten? Erzeuge ich jedes mal einen neuen Stream, oder resete ich den alten am besten. hier würde mich zudem interessieren, welchen Stream ich reseten muss und ob ich beide Streams flushen muss?
Also entweder:
Java:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeInt(1);
oos.flush;
bos.flush;
oos.reset;
bos.reset;
oos.writeInt(2);
oos.flush;
bos.flush;
.
.
.

oder
Java:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeInt(1);
oos.flush;
bos.flush;
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeInt(2);
oos.flush;
bos.flush;
.
.
.
 

Michael...

Top Contributor
Verstehe zwar nicht, warum Du einen ByteArrayOutputStream verwendest, da Du diesen ja in einen ObjektOutputStream steckst, Aber letztendlich ist für Dich nach Zeile zwei nur noch der Objektstream interessant, den ByteStream kannst Du vergessen, da er ja in erstem steckt.

Wenn sich am Stream nichts grossartig ändert, reicht es ihn per reset() zurückzusetzen.
 

Lord_Aratorn

Aktives Mitglied
Ich nutze den ByteArrayOutputStream, weil wenn die Daten geschrieben wurden, ich diese als Bytearray übertragen möchte und dazu bos.toByteArray() nutze.
 

Michael...

Top Contributor
Daten werden immer als Byte bzw. ByteArrays über tragen.

Hab ich das richtig verstanden: Du willst etwas erst in ein ByteStream schreiben, um daraus ein Byte Array zu erzeugen, das Du dann per ObjektStream versenden willst?
Dann darfst Du den ByteArrayOutputStream nicht in den ObjektStream stecken.
Du kannst allerdings aus dem ByteArrayStream per writeTo(oos) dessen Inhalt über den ObjektOutputStream versenden.
 

Lord_Aratorn

Aktives Mitglied
Ich will objekte mittels dem oos schreiben und dann als bytearray übertragen.

also
Java:
new bos();
new oos(bos);
oos.writeObject(new tollesObjekt());
byte[] serialized = bos.toByteArray();
DatagramPacket p = new Datagrampacket(serialized);
MytollerSender s = new MytollerSender()
s.send(p);
 

Michael...

Top Contributor
Sorry, habe erst jetzt verstanden, was Du vorhast. Du benutzt den ObjectStream um den Puffer des ByteArrayStreams zu füllen. Ich dachte Du willst die Daten über den ObjectOutputStream versenden.
Insofern passt das ja was Du im letzten Post geschrieben hast. Was die ersten Fragen angeht:
ein flush - falls überhaupt notwendig - auf den oos reicht aus, da es an den bos weitergegeben wird.
ein reset muss auf oos und bos ausgeführt werden.
 

Semox

Bekanntes Mitglied
Hi, ich möchte Objekte mittels eines Outputstreams und eines Bytearrayoutputstreams serialisieren. Im nächsten Schritt die Streams überschreiben. Nun stellt sich mir die Frage, wie mache ich das am besten? Erzeuge ich jedes mal einen neuen Stream, oder resete ich den alten am besten. hier würde mich zudem interessieren, welchen Stream ich reseten muss und ob ich beide Streams flushen muss?
Also entweder:
Java:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeInt(1);
oos.flush;
bos.flush;
oos.reset;
bos.reset;
oos.writeInt(2);
oos.flush;
bos.flush;
.
.
.

oder
Java:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeInt(1);
oos.flush;
bos.flush;
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeInt(2);
oos.flush;
bos.flush;
.
.
.

Hi

Da Du den einen in einen zweiten Outputstream hüllst, braucht man das flushen beider Streams nicht. Also in diesem Fall reicht es, wenn Du oos.flush() schreibst. Dann wird der gesamte Puffer wohin geschrieben. Wenn Du bos auch noch flushest, dann passiert der Schreibvorgang Token-weise. Um das zu vermeiden hüllt man ja dann extra den ersten in den zweiten Stream.

Hier ein Beispiel eines aktuellen Projekts von mir:

Java:
try {
	getList();
	// Objektstream fuer Ausgabe von Daten in eine Datei
	ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(datei));
        oos.writeObject(list);
	oos.flush();
	oos.close();
} catch (IOException e) {
	e.printStackTrace();
}

Hoffe das hilft Dir weiter.

Viele Grüße,
Semo
 

Lord_Aratorn

Aktives Mitglied
Danke, sowas in der Art habe ich mir gedacht. Und was ist performanter? Wenn der Stream resetet wird, oder zwei neue Outputstream-Objekte erzeugt werden?
 

Ähnliche Java Themen

Neue Themen


Oben