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.