Input/Output ZipOutputStream erzeugt zu großes .zip-Archiv

Seikuassi

Aktives Mitglied
Hallo,

ich habe mal ein (hoffentlich) einfaches Problem mit dem ZipOutputStream.
Betrachten wir folgenden funktionierenden Code:
Java:
try(ZipOutputStream zip=new ZipOutputStream(new BufferedOutputStream(new FileOutputStream("./Test.zip")),StandardCharsets.UTF_8)){
   for(int i=0;i<500;i++){
      zip.putNextEntry(new ZipEntry("entry"+Integer.valueOf(i)+".dat"));
      zip.write(new String("HalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHallo").getBytes(StandardCharsets.UTF_8));
      zip.closeEntry();
   }
   zip.finish();
}
Optionale Frage:Warum wird keine Datei mit dem DEFLATED-Modus komprimiert. Alle Dateien sind 140 Bytes groß (keine Kompression).

Deswegen dachte ich in meinem jugendlichen Leichtsinn 🙂, dass ich einfach den DeflaterOutputStream verwende mit einem ByteArrayOutputStream und diesen in einen bzw. mehrer ZipEntry(s) schreibe:
Java:
try(ZipOutputStream zip=new ZipOutputStream(new BufferedOutputStream(new FileOutputStream("./Test.zip")),StandardCharsets.UTF_8)){
   for(int i=0;i<500;i++){
      try(ByteArrayOutputStream b=new ByteArrayOutputStream();
      DeflaterOutputStream defl=new DeflaterOutputStream(new BufferedOutputStream(b))){
         defl.write(new String("HalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHalloHallo").getBytes(StandardCharsets.UTF_8));
         defl.finish();
         defl.flush();
         zip.putNextEntry(new ZipEntry("entry"+Integer.valueOf(i)+".dat"));
         zip.write(b.toByteArray());
         zip.closeEntry();
         b.reset();
      }
   }
   zip.finish();
}
Die Dateien (Einträge) in dem .zip-Archiv sind zwar jetzt nur noch 16 Byte groß (statt 140 Byte), das gesamte .zip-Archiv ist allerdings wie vorher noch immer etwa 67,3 kB groß.
Frage:Wie kann das sein?
Im Hex-Editor habe ich außerdem gesehen, dass scheinbar für jeden Eintrag die ZIP-Signatur (PK...) neu geschrieben wurde, was natürlich ein Grund ist, dass das Archiv so groß ist.
Wo liegt also der Fehler?

Danke im Voraus!

Mit freundlichen Grüßen

Seikuassi
 
Gut bei dem obersten Code ist ein Kompressionsgrad von 1,04 (70000 B/67300 B) erreicht worden.
Doch bei dem DeflaterOutputStream ist ein Kompressionsgrad von 8,75 (140 B/16 B) erreicht worden. Wie kann das also sein, dass das .zip-Archiv viel größer ist, als alle Größen seiner Einträge zusammen ergeben?

Danke nochmal im Voraus!
 

Zurück
Oben