Hallo zusammen.
Ich möchte Dateien mit dem GZIPOutputStream aus java.util.zip packen, was ja eigentlich genauso ablaufen und das gleiche Ergebnis liefern sollte die das „echte“ gzip. Problem: das tut es nicht (bezogen auf die Größe der gepackten Datei), was für mich aber sehr wichtig wäre.
Wenn ich einen konkreten String (Länge 44) den ich vorher in eine Datei gepackt habe - in der Methode „uncompressedFile“ - mit folgender Methode packe:
int read = 0;
byte[] data = new byte[1024];
try {
fileIn = new FileInputStream(uncompressedFile);
zipOut = new GZIPOutputStream(new FileOutputStream(compressedFile));
while((read = fileIn.read(data, 0, 1024)) != -1) {
zipOut.write(data, 0, read);
}
fileIn.close();
zipOut.close();
} catch…
und mir dann die Größe der gepackten Datei ausgeben lassen, wird eine Größe von 39B ausgegeben.
Jetzt packe ich die gleiche Ausgangsdatei mit dem selben String als Inhalt mit gzip und erhalte unabhängig der gewählten Kompressionsstufe (1-9) immer eine Datei mit der Größe 51B.
Sollten die Dateigrößen nicht identisch sein, wenn nach dem selben Verfahren gepackt wird?
Wenn ich versuche, den String direkt mit Hilfe des Deflaters aus java.util.zip zu packen (also direkt mit dem Algorithmus, den gzip angeblich benutzt), mit folgender Methode:
try {
byte[] input = string.getBytes(„UTF-8“);
byte[] output = new byte[32768];
this.deflater = new Deflater(1);
deflater.setInput(input);
deflater.finish();
int compressedDataLength = deflater.deflate(output);
System.out.println(compressedDataLength);
bekomme ich unabhängig vom Argument im Konstruktor des Deflaters (1-9, sollte wieder die Kompressionsstufe einstellen) stets die Größe 27B ausgegeben.
Ich vermute mal, die Ausgabe des Deflaters ist die kleinste, weil hier nicht noch der Overhead der gzip-Datei mit eingeht.
Bleibt die Frage: warum unterscheiden sich die Größen der Dateien, die gzip erzeugt von denen, die mit dem GZIPOutputStream erstellt werden?
Ich habe vorher noch nicht mit dem Package java.util.zip gearbeitet. Sollte mein Code ein paar Mängel haben, wäre ich auch da für Anregungen dankbar. Denn was in der ersten Methode das byte-Array macht, ist mir zum Beispiel nicht wirklich klar. Sollte man nicht auch bei dem GZIPOutputStream einstellen können, wie gut er komprimiert?
Hintergrund der ganzen Sache: die Größen der Dateien die gzip erstellt haben eine interessante Eigenschaft bezogen auf den Ursprung ihres Inhalts, so dass für mich genau diese Größen sehr wichtig sind und ich auch genau diese brauche. Natürlich könnte ich einfach einen Aufruf an gzip schicken - sowas finde ich aber immer sehr unschön, unelegant und überflüssig, wenn Java mir doch eigentlich alles geben sollte, was ich brauche.
Kurz: wie bekomme ich es hin, mit Java genau das gleiche zu machen wie gzip?
Ich hoffe, Ihr könnt mir mal wieder helfen
Gruß
Schorsch