So erstellen Sie ein Unkomprimiertes Zip-Archiv in Java
Ich bin mit dem Zip-utility-Paket von Java und wollte wissen, wie man erstellen Sie eine zip-Datei ohne Komprimierung. - Einstellung der Stufe 0 nicht helfen. Ist das richtig?
Auch, wenn ich STORED
Methode, wirft es folgende Ausnahme:
java.util.zip.ZipException: STORED entry missing size, compressed size, or crc-32
Kann ich die Größe festlegen, aber jetzt folgende exception geworfen wird:
java.util.zip.ZipException: invalid entry crc-32
Ich bin nur nach all den Beispielen von auf der Suche im web, und ich bin nicht in der Lage, um wirklich es richtig zu verstehen, denke ich. Es wäre toll, wenn mir jemand helfen kann auf dieser und mir Anregung zu korrigieren das problem, das ich tun könnte.
InformationsquelleAutor der Frage | 2009-07-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin misstrauisch gegenüber aperkins Lösung (da gelöscht), aber ich weiß, warum es funktioniert. Die Linie (die inzwischen behoben worden in seinem Antwort)
war mit dem statischen Wert
ZipOutputStream.STORED
die zufällig gleich0
. Also was die Zeile macht, ist die Einstellung der Ebene verwendet die Standard-ENTLÜFTET-Methode auf null Kompression (dies ist offensichtlich, was Sie wollen zu tun, sondern passiert nur durch Glück). So, um zu bekommen, was Sie wollen explizit und sicher, verwenden Sie diese statt:oder
Wenn Sie
wirst du wahrscheinlich die Ausnahme, dass Keya stellte in der ursprünglichen Frage. Ich glaube Christian Schlichtherle ist richtig, Sie sind immer die Ausnahmen, weil Sie nicht die Einstellung der CRC in den Eintrag. Die Auswirkungen davon ist, dass die Verwendung der GESPEICHERTEN Methode, die Sie Lesen müssen, um den gesamten Eintrag Datei zuerst, oder einen anderen Weg finden, um die Größe, komprimierte Größe (muss gleich sein) und die CRC-rufen Sie vor
zipOut.putNextEntry()
. Sonst, Sie laufen in mehr Ausnahmen, wenn Sie überrannt, das size-Attribut schreiben zu viele bytes in den output-stream. Es wird angezeigt, dass die ZIP-Spezifikationen sagen, dass, wenn Sie schreiben, die GESPEICHERTEN Daten dann zu schreiben, hat das header [enthält die CRC-32 und Länge] "up front", bevor die Daten selbst, also die java-API ist, dass diese eingestellt werden, bevor es gestartet werden kann, da es im Grunde nur unterstützt das streaming aus der letzten zip-Datei.InformationsquelleAutor der Antwort PMorganCA
Müssen Sie die
STORED
Methode, aber dies erfordert, dass Sie diesize
compressedSize
undcrc32
Eigenschaften des entsprechendenZipEntry
bevor Sie anrufen können SieputNextEntry
auf dieZipOutputStream
. Können Sie vorausberechnen, die CRC-32 durch die Verwendung einesCrc32OutputStream
.InformationsquelleAutor der Antwort Christian Schlichtherle
FYI:
Im JDK Source die Methode [java.util.zip.ZipOutputStream.setLevel(int)]:
Es einfach umleiten der Grad der Komprimierung festlegen, um die Feld-variable [def] eine Instanz von [java.util.zip.Deflater].
Und in den source-code der Klasse [java.util.zip.Deflater]:
So, ich denke, es wird besser lesbar, wenn Sie die Konstante mit dem Wert [Deflater.NO_COMPRESSION]:
InformationsquelleAutor der Antwort Li Ying