Arbeiten mit ZIP/Archiven in Java: java.util.zip und Zip4j
Datenkomprimierung und Archivierung gehören zu den Kernaufgaben bei der Entwicklung von Java-Anwendungen. ZIP-Archive werden häufig zum Verpacken von Dateien, zur Datenübertragung über Netzwerke und zur Einsparung von Speicherplatz verwendet. In diesem Artikel betrachten wir zwei grundlegende Ansätze für die Arbeit mit ZIP-Archiven in Java: das integrierte Paket java.util.zip und die leistungsstarke Drittanbieter-Bibliothek Zip4j.
Das Standardpaket java.util.zip
Seit JDK 1.1 ist in Java das Paket java.util.zip verfügbar, das grundlegende Klassen für die Arbeit mit dem ZIP-Format bereitstellt. Die wichtigsten Klassen:
ZipOutputStream— zum Erstellen von ZIP-ArchivenZipInputStream— zum Lesen von ZIP-ArchivenZipEntry— repräsentiert einen einzelnen Eintrag (Datei oder Ordner) innerhalb des ArchivsZipFile— für den wahlfreien Zugriff auf den Archivinhalt
Erstellen eines ZIP-Archivs mit java.util.zip
import java.io.*;import java.util.zip.*;
public class ZipCreator { public static void main(String[] args) throws IOException { String sourceFile = "document.txt"; String zipName = "archive.zip";
try (FileOutputStream fos = new FileOutputStream(zipName); ZipOutputStream zos = new ZipOutputStream(fos)) {
File fileToZip = new File(sourceFile); FileInputStream fis = new FileInputStream(fileToZip);
ZipEntry zipEntry = new ZipEntry(fileToZip.getName()); zos.putNextEntry(zipEntry);
byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) >= 0) { zos.write(buffer, 0, length); } zos.closeEntry(); fis.close(); } System.out.println("Archiv erstellt: " + zipName); }}Entpacken eines ZIP-Archivs
import java.io.*;import java.util.zip.*;
public class ZipExtractor { public static void main(String[] args) throws IOException { String zipFile = "archive.zip"; String outputDir = "extracted";
new File(outputDir).mkdirs();
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) { ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { File newFile = new File(outputDir, entry.getName()); new File(newFile.getParent()).mkdirs();
FileOutputStream fos = new FileOutputStream(newFile); byte[] buffer = new byte[1024]; int len; while ((len = zis.read(buffer)) > 0) { fos.write(buffer, 0, len); } fos.close(); zis.closeEntry(); } } System.out.println("Entpacken abgeschlossen in Ordner: " + outputDir); }}Einschränkungen von java.util.zip:
- Keine Unterstützung für Verschlüsselung (Passwortschutz)
- Eingeschränkte Unicode-Unterstützung in Dateinamen (vor Java 7)
- Keine Unterstützung für ZIP64 bei Archiven > 4 GB (vor Java 8)
- Komplexität bei der Arbeit mit verschachtelten Ordnern
Die Bibliothek Zip4j — erweiterte Funktionen
Zip4j ist eine beliebte Open-Source-Drittanbieter-Bibliothek, die die meisten Einschränkungen des Standardpakets behebt. Fügen Sie für die Einbindung die folgende Abhängigkeit in Maven hinzu:
<dependency> <groupId>net.lingala.zip4j</groupId> <artifactId>zip4j</artifactId> <version>2.11.5</version></dependency>Erstellen eines verschlüsselten ZIP-Archivs mit Zip4j
import net.lingala.zip4j.ZipFile;import net.lingala.zip4j.model.ZipParam