Ich habe festgestellt, dass die Unzip-Funktion in Java extrem langsam ist, verglichen mit der Verwendung eines nativen Tools wie WinZip.
Gibt es eine Drittanbieter-Bibliothek für Java, die effizienter ist? Open Source wird bevorzugt.
Bearbeiten
Hier ist ein Geschwindigkeitsvergleich mit der Java-basierten Lösung vs 7zip. Ich habe gepufferte Input / Output-Streams in meiner ursprünglichen Lösung hinzugefügt (danke Jim, das hat einen großen Unterschied gemacht).
Zip Dateigröße: 800K Java-Lösung: 2,7 Sekunden 7Zip-Lösung: 204 ms
Hier ist der modifizierte Code, der die eingebaute Java-Dekomprimierung verwendet:
%Vor%Das Problem ist nicht das Entpacken, es ist die ineffiziente Art, die entpackten Daten zurück auf die Festplatte zu schreiben. Meine Benchmarks zeigen, dass mit
%Vor%reduziert stattdessen die Ausführungszeit der Methode um den Faktor 5 (von 5 auf 1 Sekunde für eine 6-MB-Zip-Datei).
Der wahrscheinlichste Schuldige ist die Verwendung von bis.available()
. Abgesehen davon, dass es falsch ist (verfügbar gibt die Anzahl der Bytes zurück, bis ein Aufruf zum Lesen blockiert wird, nicht bis zum Ende des Streams), umgeht dies die von BufferedInputStream bereitgestellte Pufferung, was einen nativen Systemaufruf für jedes in die Ausgabedatei kopierte Byte erfordert.
Beachten Sie, dass das Umbrechen in einen BufferedStream nicht erforderlich ist, wenn Sie wie oben die Massenlese- und -schreibmethoden verwenden und der Code zum Schließen der Ressourcen nicht ausnahmesicher ist (wenn Lesen oder Schreiben aus irgendeinem Grund fehlschlägt, weder is
oder os
wäre geschlossen). Schließlich, wenn Sie IOUtils im Klassenpfad haben, empfehle ich die Verwendung ihrer gut getesteten IOUtils.copy
statt Ihre eigenen zu rollen.
Ich habe eine "unelegante" Lösung gefunden. Es gibt ein Open-Source-Programm 7zip (www.7-zip.org), das kostenlos verwendet werden kann. Sie können die Befehlszeilenversion herunterladen ( Ссылка ). 7-zip wird nur unter Windows unterstützt, aber es sieht so aus, als wäre es auf andere Plattformen (p7zip) portiert worden.
Offensichtlich ist diese Lösung nicht ideal, da sie plattformspezifisch ist und auf einer ausführbaren Datei beruht. Allerdings ist die Geschwindigkeit im Vergleich zum Entpacken in Java unglaublich.
Hier ist der Code für die Dienstprogrammfunktion, die ich für die Verbindung mit diesem Dienstprogramm erstellt habe. Es gibt Raum für Verbesserungen, da der folgende Code Windows-spezifisch ist.
%Vor%