FileOutputStream und ByteArrayOutputStream

8

Ich lese den Code von jemand anderem. Hier ist der Kern davon.

Eine Klasse komprimiert und dekomprimiert Dateien mit GZIPInputStream und GZIPOutputStream.

Hier ist ein Ausschnitt dessen, was während der Komprimierung abläuft. inputFile und outputFile sind Instanzen der Klasse File .

%Vor%

Nun, hier ist was während der Dekompression passiert.

%Vor%

Was ist ein möglicher Grund, warum der ursprüngliche Programmierer FileOutputStream während der Komprimierung und ByteArrayOutputStream während der Dekomprimierung gewählt hat? Das verwirrt mich.

Wenn es keinen guten Grund gibt, denke ich, dass ich sie ändern werde, um eine zukünftige Verwirrung zu vermeiden. Ist das eine gute Idee?

    
Russell 03.01.2011, 18:09
quelle

4 Antworten

11

Heh, klingt, als hätten sie Code aus verschiedenen Quellen kopiert und eingefügt? :-P Nein, ernsthaft, wenn Sie die dekomprimierten Daten nicht untersuchen müssen, können Sie einfach ein BufferedOutputStream für die Komprimierung und Dekomprimierung verwenden.

    
Chris Jester-Young 03.01.2011, 18:12
quelle
4

Das ByteArrayOutputStream ist mehr Speicherbedarf, da es den gesamten Inhalt im Java-Speicher ablegt (im Stil von byte[] ). Das FileOutputStream schreibt direkt auf die Festplatte und ist daher weniger Speicher. Ich sehe keinen vernünftigen Grund, ByteArrayOutputStream in diesem speziellen Fall zu verwenden. Es modifiziert die einzelnen Bytes danach nicht. Es wird nur unverändert in die Datei geschrieben. Es ist somit ein unnötiger Zwischenschritt.

    
BalusC 03.01.2011 18:13
quelle
2

Der Programmierer hat während der Komprimierung FileInputStream verwendet und beim Dekomprimieren Puffer verwendet. Ich denke, dass der Grund dafür war, dass nichts Schlimmes passiert, wenn du versuchst, die Datei zu lesen. Sie scheitern einfach und eine Ausnahme wird ausgelöst.

Wenn Sie beim Dekomprimieren versagen und bereits mit dem Schreiben in die Datei begonnen haben, ist die Datei beschädigt. Also entschied er sich, zuerst den Puffer zu schreiben und dann, wenn die Dekomprimierung abgeschlossen ist, den Puffer auf der Festplatte zu schreiben. Diese Lösung ist in Ordnung, wenn Sie mit relativ kleinen Dateien arbeiten. Sonst erfordert dies viel Speicher und könnte OutOfMemeoryError erzeugen.

Ich würde zip direkt in die temporäre Datei extrahieren und dann die temporäre Datei in ihren permanenten Namen umbenennen. Abschließend sollte Block darauf achten, die temporäre Datei zu löschen.

    
AlexR 03.01.2011 18:17
quelle
0

ByteArrayOutputStream würde ihm / ihr einen netten OutOfMemoryError geben?

Im Ernst, sie wurden wahrscheinlich zu verschiedenen Zeiten gemacht. Wenn Sie können, würde ich die VCS-Protokolle konsultieren.

    
sblundy 03.01.2011 18:12
quelle

Tags und Links