Streams

wakoz

Erfahrenes Mitglied
Moin ;)

Also eigentlich ist es eine Dumme Frage xD

Wenn ich einen Stream erzeuge und Daten rein gebe liegen dann die Daten Zwei mal im Speicher oder räumt Java gleich auf?

In meinem Fall wird es noch etwas Tricky ;)

Ich Möchte eine Klasse Serialisieren Verschlüsselt und mittels Stream versenden.

Also habe ich mein Objekt Stream (In-/Output) ein ByteArray Stream (In-/Output) und einen Cipher Stream (In-/Output) der das Byte Array Verschlüsselt.

Habe ich dann meine Daten Viermal im Speicher? Als für jeden Stream plus das Ausgangs Objekt.

Danke für eure Antworten
 
Nein, nur zwei mal :
Das Objekt selbst und das interne Byte-Array des ByteArrayOutputStreams.
Bevor du dir jetzt aber das Array holen kannst solltest du den ByteArrayOutputStream unbedingt closen. Dann holst du dir mit toByteArray() das Byte-Array und hast damit die Daten nun dreimal im Speicher. Erst wenn du ALLE Referenzen auf das ByteArrayOutputStream-Objekt auf NULL setzt räumt Java dieses auf. Wenn du jetzt noch alle Referenzen auf das ursprungs-Objekt auf NULL setzt räumt Java diese auch auf und du hast wenn alles gut gegangen ist nur noch das ByteArray im Speicher.
 
Interessanter Gedanke ein Objekt (Bite Array) aus einem Stream zu ziehen wenn dieses noch nicht drin ist xD close und somit flush ist klar xD

Ich bin mir nur Unsicher weil ich mein Uhrsprungs Objekt durch drei Streams schiebe bevor ich es versenden kann.

Aber Danke
 
Da hast du dann aber beim Thema Streams nicht gut aufgepasst.
Du schiebst dein Objekt nur durch EINEN Stream , nämlich dem ObjectOutputStream. Dieser liegt aber nur über einem anderen Stream auf , dem CipherOutputStream welcher wiederrum nur über dem ByteArrayOutputStream liegt.

Gehen wir es mal von "unten" an :

der ByteArrayOutputStream ist das ZIEL , also der Punkt an dem dann wirklich Daten in den Speicher geschrieben werden.
Der darüber gelegte CipherOutputStream hat jetzt aber nicht die Aufgabe selbst irgendwelche Daten zu speichern. Er ist lediglich eine Wraper-Klasse der die Daten die vom drüberliegenden ObjectOutputStream kommen umzuwandeln *in diesem Fall zu verschlüsseln* und weiter nach unten durchzugeben. Er selbst speichert nichts *außer natürlich seinen Einstellungen wie Modus und Schlüssel*.
Der oberste Stream ist der ObjectOutputStream. Dieser hat die Aufgabe Daten entgegenzunehmen und an seinen delegierten Stream weiterzuleiten. Auch hier gilt das selber wie beim CipherStream : der ObjectOutputStream hat nur die Aufgabe ein Objekt das im Speicher liegt in eine Folge von Bytes zu übersetzen die dann via Netzwerk versendet oder auf Platte geschrieben werden können. Er selbst speichert dabei keine Daten.

Was dein ersten Satz angeht : natürlich erst das Byte-Array ausm Stream ziehen NACHDEM du das Objekt dort reingeschrieben hast.
 

Neue Beiträge

Zurück