Ich habe mir die Standard-Zip-Bibliothek angesehen, die mit dem JDK und den Apache-Komprimierungsbibliotheken geliefert wird, und bin aus drei Gründen mit ihnen unzufrieden:
Sie sind aufgebläht und haben ein schlechtes API-Design. Ich muss 50 Zeilen Boiler-Plate-Byte-Array-Ausgabe, Zip-Eingabe, Datei-Out-Streams und Schließen relevanter Streams schreiben und Ausnahmen abfangen und Byte-Puffer selbst verschieben . Warum kann ich keine einfache API haben, die so aussieht
Zipper.unzip(InputStream zipFile, File targetDirectory, String password = null)
undZipper.zip(File targetDirectory, String password = null)
einfach funktioniert?Es scheint, dass das Entpacken beim Entpacken die Metadaten der Datei zerstört und die Kennwortbehandlung fehlerhaft ist.
Außerdem waren alle Bibliotheken, die ich ausprobiert habe, 2-3x langsam im Vergleich zu den Befehlszeilen-Zip-Tools, die ich mit UNIX erhalte.
Für mich sind (2) und (3) kleine Punkte, aber ich möchte wirklich eine gut getestete Bibliothek mit einer einzeiligen Schnittstelle.
quelle
Antworten:
Ich weiß, dass es spät ist und es gibt viele Antworten, aber dieses zip4j ist eine der besten Bibliotheken zum Zippen, die ich verwendet habe. Es ist einfach (kein Boiler-Code) und kann problemlos passwortgeschützte Dateien verarbeiten.
Die Maven-Abhängigkeit ist:
quelle
Mit Apache Commons-IO ‚s
IOUtils
können Sie dies tun:Es ist immer noch ein Boilerplate-Code, aber es gibt nur eine nicht exotische Abhängigkeit: Commons-IO
quelle
close()
es nicht schaden.Extrahieren Sie die Zip-Datei und alle ihre Unterordner nur mit dem JDK:
Zip-Dateien und alle ihre Unterordner:
quelle
extractFolder(String zipFile,String extractFolder)
Eine weitere Option, die Sie auschecken können, ist zt-zip, das auf der Maven-Zentral- und Projektseite unter https://github.com/zeroturnaround/zt-zip verfügbar ist
Es verfügt über die Standardfunktion zum Packen und Entpacken (in Streams und im Dateisystem) + viele Hilfsmethoden zum Testen von Dateien in einem Archiv oder zum Hinzufügen / Entfernen von Einträgen.
quelle
Vollständige Implementierung zum Zip / Entpacken eines Ordners / einer Datei mit zip4j
Laden Sie das Glas von hier herunter und fügen Sie es Ihrem Projekterstellungspfad hinzu. Der
class
Balg kann jede Datei oder jeden Ordner mit oder ohne Passwortschutz komprimieren und extrahieren.quelle
Ein sehr schönes Projekt ist TrueZip .
Zum Beispiel (von der Website ):
quelle
Eine weitere Option ist JZlib . Nach meiner Erfahrung ist es weniger "dateizentriert" als zip4J. Wenn Sie also an In-Memory-Blobs anstatt an Dateien arbeiten müssen, sollten Sie es sich ansehen.
quelle
Hier finden Sie ein vollständiges Beispiel für das rekursive Komprimieren und Entpacken von Dateien: http://developer-tips.hubpages.com/hub/Zipping-and-Unzipping-Nested-Directories-in-Java-using-Apache-Commons-Compress
quelle
Haben Sie sich http://commons.apache.org/vfs/ angesehen ? Es behauptet, viele Dinge für Sie zu vereinfachen. Aber ich habe es nie in einem Projekt verwendet.
Mir sind auch keine anderen Java-Native-Komprimierungsbibliotheken als das JDK oder die Apache-Komprimierung bekannt.
Ich erinnere mich, dass wir einige Funktionen aus Apache Ant herausgerissen haben - sie haben viele Utils für die Komprimierung / Dekomprimierung eingebaut.
Beispielcode mit VFS würde folgendermaßen aussehen:
quelle