Spojrzałem na domyślną bibliotekę Zip dostarczaną z bibliotekami kompresji JDK i Apache i jestem z nich niezadowolony z 3 powodów:
Są wzdęte i mają zły projekt API. Muszę napisać 50 wierszy danych wyjściowych tablicy bajtów kotła, danych wejściowych zip, wydzielić pliki i zamknąć odpowiednie strumienie oraz wyłapać wyjątki i samodzielnie przenieść bufory bajtów ? Dlaczego nie mogę mieć prostego interfejsu API, który wygląda tak
Zipper.unzip(InputStream zipFile, File targetDirectory, String password = null)
iZipper.zip(File targetDirectory, String password = null)
to po prostu działa?Wygląda na to, że rozpakowanie rozpakowanie niszczy metadane pliku i obsługa hasła jest zepsuta.
Czy wszystkie biblioteki, które wypróbowałem, były 2-3 razy wolniejsze w porównaniu z narzędziami zip wiersza poleceń, które otrzymuję w systemie UNIX?
Dla mnie (2) i (3) to drobne punkty, ale naprawdę chcę dobrej testowanej biblioteki z interfejsem jednowierszowym.
źródło
Odpowiedzi:
Wiem, że jest późno i jest wiele odpowiedzi, ale ten zip4j jest jedną z najlepszych bibliotek do zipowania, z których korzystałem. Jest prosty (bez kodu kotła) i może z łatwością obsługiwać pliki chronione hasłem.
Zależność Maven to:
źródło
Z Apache Commons IO „s
IOUtils
można to zrobić:To wciąż jakiś kod, ale ma tylko 1 nieegzotyczną zależność: Commons-IO
źródło
close()
nie będzie bolało.Wyodrębnij plik zip i wszystkie jego podfoldery, używając tylko JDK:
Pliki zip i wszystkie jego podfoldery:
źródło
extractFolder(String zipFile,String extractFolder)
Inną opcją, którą możesz sprawdzić, jest zt-zip dostępny w centrali Maven i na stronie projektu pod adresem https://github.com/zeroturnaround/zt-zip
Posiada standardową funkcję pakowania i rozpakowywania (w strumieniach i systemie plików) + wiele metod pomocniczych do testowania plików w archiwum lub dodawania / usuwania wpisów.
źródło
Pełna implementacja do rozpakowywania / rozpakowywania folderu / pliku za pomocą zip4j
Pobierz słoik stąd i dodaj go do ścieżki kompilacji projektu. Poniżej
class
można skompresować i wyodrębnić dowolny plik lub folder, z lub bez ochrony hasłem-źródło
Bardzo fajnym projektem jest TrueZip .
Na przykład (ze strony internetowej ):
źródło
Inną opcją jest JZlib . Z mojego doświadczenia wynika, że jest mniej „wyśrodkowany na plikach” niż zip4J, więc jeśli chcesz pracować nad obiektami BLOB w pamięci, a nie plikami, możesz rzucić na to okiem.
źródło
Oto pełny przykład rekompensowania i rozpakowywania plików rekurencyjnie: http://developer-tips.hubpages.com/hub/Zipping-and-Unzipping-Nested-Directories-in-Java-using-Apache-Commons-Compress
źródło
Czy rzuciłeś okiem na http://commons.apache.org/vfs/ ? Upraszcza to dla ciebie wiele rzeczy. Ale nigdy nie użyłem tego w projekcie.
Nie jestem również świadomy bibliotek kompresji Java-Native innych niż JDK lub Apache Compression.
Pamiętam, jak raz zebraliśmy niektóre funkcje z Apache Ant - mają wbudowane wiele narzędzi do kompresji / dekompresji.
Przykładowy kod z VFS wyglądałby następująco:
źródło