Komprimieren und Entpacken von Dateien in Java

Übersicht

In diesem Artikel lernen Sie, wie Sie Zip-Dateien mit Hilfe verschiedener Methoden unter Verwendung der Java-API und von Beispielcode programmatisch komprimieren können. Sie lernen, wie man eine oder mehrere Dateien komprimiert und wie man Dateien gleichzeitig komprimiert. Sie lernen auch, wie Sie Dateien dekomprimieren oder entpacken können.

Komprimieren von Dateien in Java und Dekomprimieren bzw. Entpacken von Dateien in Java

Mit der Aspose.ZIP API können Sie Dateien komprimieren und dekomprimieren, ohne sich um die zugrunde liegende Dateistruktur kümmern zu müssen. Dieser Artikel zeigt, wie man sowohl mit einer als auch mit mehreren Dateien komprimiert.

Komprimieren von Dateien

Einzelne Datei komprimieren

Schritte: Komprimieren einer einzelnen Datei in Java

  1. Erstellen Sie einen file output stream mit dem gewünschten Namen Ihrer Zip-Ausgabedatei.
  2. Erstellen Sie einen file input stream mit der zu komprimierenden Datendatei.
  3. Erstellen Sie eine Instanz der Klasse Archive und übergeben Sie ihr eine Instanz der Klasse ArchiveEntrySettings.
  4. Fügen Sie die in Schritt 2 erstellte Datendatei mit der Methode Archive.createEntry hinzu.
  5. Komprimieren Sie die Datendatei mit der Methode Archive.save und übergeben Sie ihr den in Schritt 1 erstellten Dateistrom.
 1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "CompressSingleFile_out.zip")) {
 2    //Datei, die dem Archiv hinzugefügt werden soll
 3    try (FileInputStream source1 = new FileInputStream(dataDir + "alice29.txt")) {
 4        try (Archiv archive = new Archive(new ArchiveEntrySettings())) {
 5            archive.createEntry("alice29.txt", source1);
 6            archive.save(zipFile);
 7        }
 8    }
 9} catch (IOException ex) {
10    System.out.println(ex);
11}

Mehrere Dateien komprimieren

Schritte: Komprimieren mehrerer Dateien in Java

  1. Erzeugen Sie einen Dateistrom mit dem gewünschten Namen der Zip-Ausgabedatei.
  2. Erstellen Sie den Dateistrom der ersten zu komprimierenden Datei.
  3. Erzeugen Sie den Dateistrom der zweiten zu komprimierenden Datei.
  4. Erzeuge eine Instanz der Klasse Archive.
  5. Fügen Sie die in Schritt 2 und Schritt 3 erstellten Datendateien mit der Methode Archive.createEntry hinzu.
  6. Erstellen Sie eine Instanz der Klasse ArchiveSaveOptions.
  7. Komprimieren Sie die Datendateien mit der Methode Archive.save und übergeben Sie ihr den in Schritt 1 erstellten Dateistrom und die Instanz von ArchiveSaveOptions, die im obigen Schritt erstellt wurde.
 1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "CompressSingleFile_out.zip")) {
 2    try (FileInputStream source1 = new FileInputStream(dataDir + "alice29.txt")) {
 3        try (FileInputStream source2 = new FileInputStream(dataDir + "asyoulik.txt")) {
 4            try (Archiv archive = new Archive(new ArchiveEntrySettings())) {
 5                archive.createEntry("alice29.txt", Quelle1);
 6                archive.createEntry("asyoulik.txt", Quelle2);
 7                ArchiveSaveOptions options = new ArchiveSaveOptions();
 8                options.setEncoding(StandardCharsets.US_ASCII);
 9                options.setArchiveComment("Es gibt zwei Gedichte aus dem Canterbury-Korpus");
10                archive.save(zipFile, options);
11            }
12        }
13    }
14} catch (IOException ex) {
15    System.out.println(ex);
16}

Dateien nach Dateiinformationen komprimieren

Schritte: Dateien nach Dateiinformationen in Java komprimieren

  1. Öffnen Sie einen Datei-Output-Stream mit dem gewünschten Namen Ihrer Ausgabe-Zip-Datei.
  2. Erstellen Sie das Objekt File Ihrer ersten zu komprimierenden Datendatei.
  3. Erstellen Sie das Objekt File Ihrer zweiten zu komprimierenden Datendatei.
  4. Erstellen Sie eine Instanz der Klasse Archive.
  5. Fügen Sie die in Schritt 2 und Schritt 3 erstellten Datendateien mit der Methode Archive.createEntry hinzu.
  6. Erstellen Sie eine Instanz der Klasse ArchiveSaveOptions.
  7. Komprimieren Sie die Datendateien mit der Methode Archive.save und übergeben Sie ihr den in Schritt 1 erstellten Dateistrom und die Instanz von ArchiveSaveOptions, die im obigen Schritt erstellt wurde.
 1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "CompressFilesByFileInfo_out.zip")) {
 2    Datei fi1 = new Datei(dataDir + "alice29.txt");
 3    Datei fi2 = new File(dataDir + "fields.c");
 4    try (Archiv archive = new Archive()) {
 5        archive.createEntry("alice29.txt", fi1);
 6        archive.createEntry("felder.c", fi2);
 7        ArchiveSaveOptions options = new ArchiveSaveOptions();
 8        options.setEncoding(StandardCharsets.US_ASCII);
 9        archive.save(zipFile, options);
10    }
11} catch (IOException ignoriert) {
12    System.out.println(ex);
13}

Dateien in Archiven ohne Komprimierung speichern

Schritte: Speichern von Dateien in Archiven ohne Komprimierung mit Java

  1. Öffnen Sie einen Datei-Output-Stream mit dem gewünschten Namen Ihrer Zip-Ausgabe-Datei.
  2. Erstellen Sie [File]-(16)-Objekte für Ihre Datendateien, die im Archiv gespeichert werden sollen.
  3. Erstellen Sie eine Instanz der Klasse ArchiveEntrySettings und übergeben Sie ihr eine Instanz der Klasse StoreCompressionSettings.
  4. Erstellen Sie eine Instanz der Klasse Archive und übergeben Sie ihr eine Instanz der Klasse ArchiveEntrySettings, die im obigen Schritt erstellt wurde.
  5. Fügen Sie die in Schritt 2 erstellten Datei-Objekte mit der Methode Archive.createEntry hinzu.
  6. Erstellen Sie eine Instanz von ArchiveSaveOptions und setzen Sie die Codierung auf StandardCharsets.US_ASCII mit der Methode ArchiveSaveOptions.setEncoding.
  7. Komprimieren Sie die Datendateien mit der Methode Archive.save und übergeben Sie ihr den in Schritt 1 erstellten Dateistrom und die Instanz von ArchiveSaveOptions, die im obigen Schritt erstellt wurde.
 1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "StoreMultipleFilesWithoutCompression_out.zip")) {
 2    Datei fi1 = new Datei(dataDir + "alice29.txt");
 3    Datei fi2 = new File(dataDir + "fields.c");
 4    try (Archive archive = new Archive(new ArchiveEntrySettings(new StoreCompressionSettings()))) {
 5        archive.createEntry("alice29.txt", fi1);
 6        archive.createEntry("felder.c", fi2);
 7        ArchiveSaveOptions options = new ArchiveSaveOptions();
 8        options.setEncoding(StandardCharsets.US_ASCII);
 9        archive.save(zipFile, options);
10    }
11} catch (IOException ignoriert) {
12    System.out.println(ex);
13}

Parallelität zum Komprimieren von Dateien nutzen

Schritte: Parallelität zum Komprimieren von Dateien mit Java verwenden

  1. Öffnen Sie einen Dateiausgabestrom mit dem gewünschten Namen der Zip-Ausgabedatei.
  2. Öffnen Sie Dateieingangsströme für Ihre erste und zweite zu komprimierende Datei.
  3. Erstellen Sie eine Instanz der Klasse Archive.
  4. Fügen Sie die in Schritt 2 erstellten Datendateien mit der Methode Archive.createEntry hinzu.
  5. Erstellen Sie eine Instanz von ParallelOptions und setzen Sie ParallelCompressionMode.Always mit der Methode ParallelOptions.setParallelCompressInMemory.
  6. Erstellen Sie eine Instanz von ArchiveSaveOptions und setzen Sie die parallelen Optionen mit der obigen Instanz mit der Methode ArchiveSaveOptions.setParallelOptions.
  7. Komprimieren Sie die Datendateien mit der Methode Archive.save und übergeben Sie ihr den in Schritt 1 erstellten Dateistrom und die Instanz von ArchiveSaveOptions, die im obigen Schritt erstellt wurde.
 1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "UsingParallelismToCompressFiles_out.zip")) {
 2    try (FileInputStream source1 = new FileInputStream(dataDir + "alice29.txt")) {
 3        try (FileInputStream source2 = new FileInputStream(dataDir + "asyoulik.txt")) {
 4            try (Archiv archive = new Archive(new ArchiveEntrySettings())) {
 5                archive.createEntry("alice29.txt", Quelle1);
 6                archive.createEntry("asyoulik.txt", Quelle2);
 7                ParallelOptions parallelOptions = new ParallelOptions();
 8                parallelOptions.setParallelCompressInMemory(ParallelCompressionMode.Always);
 9                ArchiveSaveOptions options = new ArchiveSaveOptions();
10                options.setParallelOptions(parallelOptions);
11                options.setEncoding(StandardCharsets.US_ASCII);
12                options.setArchiveComment("Es gibt zwei Gedichte aus dem Canterbury-Korpus");
13                archive.save(zipFile, options);
14            }
15        }
16    }
17} catch (IOException ex) {
18    System.out.println(ex);
19}

LZMA-Komprimierung in ZIP-Archiven

Der Lempel-Ziv-Markov-Ketten-Algorithmus (LZMA) ist ein Algorithmus zur verlustfreien Datenkompression. LZMA verwendet einen Wörterbuch-Komprimierungsalgorithmus, wobei der komprimierte Datenstrom ein Strom von Bits ist. Die LZMA-Komprimierung innerhalb des ZIP-Archivs ermöglicht es ZIP-Containern, LZMA-komprimierte Einträge zu enthalten. Das folgende Codebeispiel zeigt die Implementierung der LZMA-Komprimierung mit Aspose.ZIP API.

Schritte: LZMA-Komprimierung im ZIP-Archiv mit Java

  1. Öffnen Sie einen Datei-Output-Stream mit dem gewünschten Namen Ihrer ZIP-Ausgabedatei.
  2. Erstellen Sie eine Instanz der Klasse ArchiveEntrySettings und übergeben Sie ihr eine Instanz der Klasse LzmaCompressionSettings.
  3. Erstellen Sie eine Instanz der Klasse Archive und übergeben Sie ihr die oben erstellte Instanz von ArchiveEntrySettings.
  4. Fügen Sie die zu komprimierenden Datendateien über Dateipfade mit der Methode Archive.createEntry hinzu.
  5. Komprimieren Sie die Datendateien mit der Methode Archive.save.
1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "LZMACompression_out.zip")) {
2    try (Archive archive = new Archive(new ArchiveEntrySettings(new LzmaCompressionSettings()))) {
3        archive.createEntry("beispiel.txt", dataDir + "beispiel.txt");
4        archive.save(zipFile);
5    }
6} catch (IOException ignoriert) {
7    System.out.println(ex);
8}

BZip2-Komprimierung in ZIP-Archiven

Die BZip2-Komprimierungseinstellungen ermöglichen es dem ZIP-Container, BZip2-komprimierte Einträge zu enthalten. Das folgende Codebeispiel zeigt die Implementierung der BZip2-Komprimierung unter Verwendung der Aspose.ZIP API.

Schritte: BZip2-Kompression innerhalb eines ZIP-Archivs mit Java

  1. Öffnen Sie einen Datei-Output-Stream mit dem gewünschten Namen Ihrer Ausgabe-Zip-Datei.
  2. Erstellen Sie eine Instanz der Klasse ArchiveEntrySettings und übergeben Sie ihr eine Instanz der Klasse Bzip2CompressionSettings.
  3. Erstellen Sie eine Instanz der Klasse Archive und übergeben Sie ihr die oben erstellte Instanz von ArchiveEntrySettings.
  4. Fügen Sie die zu komprimierenden Datendateien über Dateipfade mit der Methode Archive.createEntry hinzu.
  5. Komprimieren Sie die Datendateien mit der Methode Archive.save.
1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "Bzip2Compression_out.zip")) {
2    try (Archive archive = new Archive(new ArchiveEntrySettings(new Bzip2CompressionSettings()))) {
3        archive.createEntry("beispiel.txt", dataDir + "beispiel.txt");
4        archive.save(zipFile);
5    }
6} catch (IOException ignoriert) {
7    System.out.println(ex);
8}

Dekomprimierung von Archiven

Archiv mit einzelner Datei dekomprimieren

 1try (FileInputStream fs = new FileInputStream(dataDir + "CompressSingleFile_out.zip")) {
 2    try (Archiv archive = new Archiv(fs)) {
 3        int[] percentReady = new int[] {0};
 4        archive.getEntries().get(0).setExtractionProgressed(new Event<ProgressEventArgs>() {
 5            @Override
 6            public void invoke(Object sender, ProgressEventArgs progressEventArgs) {
 7                int percent = (int) ((100 * progressEventArgs.getProceededBytes())
 8                        / ((ArchiveEntry) sender).getUncompressedSize());
 9                if (percent > percentReady[0])
10                {
11                    System.out.println(percent + "% dekomprimiert");
12                    percentReady[0] = percent;
13                }
14            }
15        });
16        archive.getEntries().get(0).extract(dataDir + "alice_extracted_out.txt");
17    }
18} catch (IOException ex) {
19    System.out.println(ex);
20}

Archiv mit mehreren Dateien dekomprimieren

 1try (FileInputStream fs = new FileInputStream(dataDir + "CompressMultipleFiles_out.zip")) {
 2    StringBuilder sb = new StringBuilder("Die Einträge sind: ");
 3    int[] percentReady = new int[] {0};
 4    ArchiveLoadOptions options = new ArchiveLoadOptions();
 5    options.setEntryListed(new Event<EntryEventArgs>() {
 6        @Override
 7        public void invoke(Object sender, EntryEventArgs entryEventArgs) {
 8            sb.append(entryEventArgs.getEntry().getName()).append(", ");
 9        }
10    });
11    options.setEntryExtractionProgressed(new Event<ProgressEventArgs>() {
12        @Override
13        public void invoke(Object sender, ProgressEventArgs progressEventArgs) {
14            int percent = (int) ((100 * progressEventArgs.getProceededBytes())
15                    / ((ArchiveEntry) sender).getUncompressedSize());
16            if (percent > percentReady[0])
17            {
18                System.out.println(percent + "% komprimiert");
19                percentReady[0] = percent;
20            }
21        }
22    });
23    try (Archive archive = new Archive(fs, options)) {
24        System.out.println(sb.substring(0, sb.length() - 2));
25        try (FileOutputStream extrahiert = new FileOutputStream(dataDir + "alice_extrahiert_out.txt")) {
26            try (InputStream dekomprimiert = archive.getEntries().get(0).open()) {
27                byte[] buffer = new byte[8192];
28                int bytesRead;
29                while (0 < (bytesRead = decompressed.read(buffer, 0, buffer.length))) {
30                    extrahiert.write(buffer, 0, bytesRead);
31                }
32                // Lesen vom dekomprimierten Stream in die extrahierte Datei.
33            }
34        }
35        percentReady[0] = 0;
36        archive.getEntries().get(1).extract(dataDir + "asyoulik_extracted_out.txt");
37    }
38} catch (IOException ex) {
39    System.out.println(ex);
40}

Gespeichertes Archiv ohne Komprimierung extrahieren

 1try (FileInputStream zipFile = new FileInputStream(dataDir + "StoreMultipleFilesWithoutCompression_out.zip")) {
 2    try (Archiv archive = new Archive(zipFile )) {
 3        try (FileOutputStream extracted = new FileOutputStream(dataDir + "alice_extracted_store_out.txt")) {
 4            try (InputStream stored = archive.getEntries().get(0).open()) {
 5                byte[] buffer = new byte[8192];
 6                int bytesRead;
 7                while (0 < (bytesRead = stored.read(buffer, 0, buffer.length))) {
 8                    extrahiert.write(buffer, 0, bytesRead);
 9                }
10                // Lesen aus dem gespeicherten Stream in die extrahierte Datei.
11            }
12        }
13        try (FileOutputStream extracted = new FileOutputStream(dataDir + "asyoulik_extracted_store_out.txt")) {
14            try (InputStream stored = archive.getEntries().get(1).open()) {
15                byte[] buffer = new byte[8192];
16                int bytesRead;
17                while (0 < (bytesRead = stored.read(buffer, 0, buffer.length))) {
18                    extrahiert.write(buffer, 0, bytesRead);
19                }
20                // Lesen aus dem gespeicherten Stream in die extrahierte Datei.
21            }
22        }
23    }
24} catch (IOException ex) {
25    System.out.println(ex);
26}
Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.