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
- Erstellen Sie einen file output stream mit dem gew�nschten Namen Ihrer Zip-Ausgabedatei.
- Erstellen Sie einen file input stream mit der zu komprimierenden Datendatei.
- Erstellen Sie eine Instanz der Klasse Archive und �bergeben Sie ihr eine Instanz der Klasse ArchiveEntrySettings.
- F�gen Sie die in Schritt 2 erstellte Datendatei mit der Methode Archive.createEntry hinzu.
- 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
- Erzeugen Sie einen Dateistrom mit dem gew�nschten Namen der Zip-Ausgabedatei.
- Erstellen Sie den Dateistrom der ersten zu komprimierenden Datei.
- Erzeugen Sie den Dateistrom der zweiten zu komprimierenden Datei.
- Erzeuge eine Instanz der Klasse Archive.
- F�gen Sie die in Schritt 2 und Schritt 3 erstellten Datendateien mit der Methode Archive.createEntry hinzu.
- Erstellen Sie eine Instanz der Klasse ArchiveSaveOptions.
- 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
- �ffnen Sie einen Datei-Output-Stream mit dem gew�nschten Namen Ihrer Ausgabe-Zip-Datei.
- Erstellen Sie das Objekt File Ihrer ersten zu komprimierenden Datendatei.
- Erstellen Sie das Objekt File Ihrer zweiten zu komprimierenden Datendatei.
- Erstellen Sie eine Instanz der Klasse Archive.
- F�gen Sie die in Schritt 2 und Schritt 3 erstellten Datendateien mit der Methode Archive.createEntry hinzu.
- Erstellen Sie eine Instanz der Klasse ArchiveSaveOptions.
- 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
- �ffnen Sie einen Datei-Output-Stream mit dem gew�nschten Namen Ihrer Zip-Ausgabe-Datei.
- Erstellen Sie [File]-(16)-Objekte f�r Ihre Datendateien, die im Archiv gespeichert werden sollen.
- Erstellen Sie eine Instanz der Klasse ArchiveEntrySettings und �bergeben Sie ihr eine Instanz der Klasse StoreCompressionSettings.
- Erstellen Sie eine Instanz der Klasse Archive und �bergeben Sie ihr eine Instanz der Klasse ArchiveEntrySettings, die im obigen Schritt erstellt wurde.
- F�gen Sie die in Schritt 2 erstellten Datei-Objekte mit der Methode Archive.createEntry hinzu.
- Erstellen Sie eine Instanz von ArchiveSaveOptions und setzen Sie die Codierung auf StandardCharsets.US_ASCII mit der Methode ArchiveSaveOptions.setEncoding.
- 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
- �ffnen Sie einen Dateiausgabestrom mit dem gew�nschten Namen der Zip-Ausgabedatei.
- �ffnen Sie Dateieingangsstr�me f�r Ihre erste und zweite zu komprimierende Datei.
- Erstellen Sie eine Instanz der Klasse Archive.
- F�gen Sie die in Schritt 2 erstellten Datendateien mit der Methode Archive.createEntry hinzu.
- Erstellen Sie eine Instanz von ParallelOptions und setzen Sie ParallelCompressionMode.Always mit der Methode ParallelOptions.setParallelCompressInMemory.
- Erstellen Sie eine Instanz von ArchiveSaveOptions und setzen Sie die parallelen Optionen mit der obigen Instanz mit der Methode ArchiveSaveOptions.setParallelOptions.
- 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
- �ffnen Sie einen Datei-Output-Stream mit dem gew�nschten Namen Ihrer ZIP-Ausgabedatei.
- Erstellen Sie eine Instanz der Klasse ArchiveEntrySettings und �bergeben Sie ihr eine Instanz der Klasse LzmaCompressionSettings.
- Erstellen Sie eine Instanz der Klasse Archive und �bergeben Sie ihr die oben erstellte Instanz von ArchiveEntrySettings.
- F�gen Sie die zu komprimierenden Datendateien �ber Dateipfade mit der Methode Archive.createEntry hinzu.
- 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
- �ffnen Sie einen Datei-Output-Stream mit dem gew�nschten Namen Ihrer Ausgabe-Zip-Datei.
- Erstellen Sie eine Instanz der Klasse ArchiveEntrySettings und �bergeben Sie ihr eine Instanz der Klasse Bzip2CompressionSettings.
- Erstellen Sie eine Instanz der Klasse Archive und �bergeben Sie ihr die oben erstellte Instanz von ArchiveEntrySettings.
- F�gen Sie die zu komprimierenden Datendateien �ber Dateipfade mit der Methode Archive.createEntry hinzu.
- 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}