Comment zipper et dézipper des fichiers en Java
Vue d’ensemble
Cet article vous apprendra à compresser par programme des fichiers Zip à l’aide de diverses méthodes utilisant l’API Java et des exemples de code. Vous apprendrez à zipper ou à compresser un ou plusieurs fichiers, ainsi qu’à zipper des fichiers simultanément. Vous apprendrez également à décompresser ou dézipper des fichiers.
Zipper ou compresser des fichiers en Java et décompresser ou dézipper des fichiers en Java
L’API Aspose.ZIP vous permet de compresser et de décompresser des fichiers sans vous soucier de la structure du fichier sous-jacent. Cet article montre comment travailler avec la compression d’un seul ou de plusieurs fichiers.
Compression de fichiers
Compression d’un seul fichier
Étapes:Compression d’un fichier unique en Java
- Créez un file output stream avec le nom souhaité de votre fichier zip de sortie.
- Créez un flux d’entrée de fichier du fichier de données à compresser.
- Créez une instance de la classe Archive et transmettez-lui une instance de la classe ArchiveEntrySettings.
- Ajoutez le fichier de données créé à l’étape 2 à l’aide de la méthode Archive.createEntry.
- Zipper le fichier de données à l’aide de la méthode Archive.save et lui transmettre le flux de fichiers créé à l’étape 1.
1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "CompressSingleFile_out.zip")) {
2 /Fichier à ajouter à l'archive
3 try (FileInputStream source1 = new FileInputStream(dataDir + "alice29.txt")) {
4 try (Archive 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}
Compression de plusieurs fichiers
Étapes:Compression de plusieurs fichiers en Java
- Créez un flux de fichiers avec le nom souhaité de votre fichier zip de sortie.
- Créez un flux de fichiers pour le premier fichier de données à compresser.
- Créez un flux de fichiers pour le deuxième fichier de données à compresser.
- Créez une instance de la classe Archive.
- Ajoutez les fichiers de données créés aux étapes 2 et 3 à l’aide de la méthode Archive.createEntry.
- Créez une instance de la classe ArchiveSaveOptions.
- Zipper les fichiers de données à l’aide de la méthode Archive.save et lui transmettre le flux de fichiers créé à l’étape 1 et l’instance de ArchiveSaveOptions créée à l’étape précédente.
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 (Archive archive = new Archive(new ArchiveEntrySettings())) {
5 archive.createEntry("alice29.txt", source1) ;
6 archive.createEntry("asyoulik.txt", source2) ;
7 ArchiveSaveOptions options = new ArchiveSaveOptions() ;
8 options.setEncoding(StandardCharsets.US_ASCII) ;
9 options.setArchiveComment("Il y a deux poèmes du corpus Canterbury") ;
10 archive.save(zipFile, options) ;
11 }
12 }
13 }
14} catch (IOException ex) {
15 System.out.println(ex) ;
16}
Compression des fichiers par Info Fichier
Étapes:Compresser des fichiers par information de fichier en Java
- Ouvrez un flux de sortie de fichier avec le nom souhaité de votre fichier zip de sortie.
- Créez l’objet File de votre premier fichier de données à compresser.
- Créez l’objet File de votre deuxième fichier de données à compresser.
- Créez une instance de la classe Archive.
- Ajoutez les fichiers de données créés aux étapes 2 et 3 à l’aide de la méthode Archive.createEntry.
- Créez une instance de la classe ArchiveSaveOptions.
- Zipper les fichiers de données à l’aide de la méthode Archive.save et lui transmettre le flux de fichiers créé à l’étape 1 et l’instance de ArchiveSaveOptions créée à l’étape précédente.
1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "CompressFilesByFileInfo_out.zip")) {
2 Fichier fi1 = nouveau Fichier(dataDir + "alice29.txt") ;
3 Fichier fi2 = nouveau fichier (dataDir + "fields.c") ;
4 try (Archive archive = new Archive()) {
5 archive.createEntry("alice29.txt", fi1) ;
6 archive.createEntry("fields.c", fi2) ;
7 ArchiveSaveOptions options = new ArchiveSaveOptions() ;
8 options.setEncoding(StandardCharsets.US_ASCII) ;
9 archive.save(zipFile, options) ;
10 }
11} catch (IOException ignored) {
12 System.out.println(ex) ;
13}
Stockage de fichiers dans des archives sans compression
Etapes:Stockage de fichiers dans des archives sans compression en utilisant Java
- Ouvrez un flux de sortie de fichier avec le nom souhaité de votre fichier zip de sortie.
- Créez des objets File pour vos fichiers de données à stocker dans l’archive.
- Créez une instance de la classe ArchiveEntrySettings et transmettez-lui une instance de la classe StoreCompressionSettings.
- Créez une instance de la classe Archive et transmettez-lui une instance de la classe ArchiveEntrySettings créée à l’étape précédente.
- Ajouter les objets Fichier créés à l’étape 2 en utilisant la méthode Archive.createEntry.
- Créez une instance de ArchiveSaveOptions et définissez l’encodage à StandardCharsets.US_ASCII en utilisant la méthode ArchiveSaveOptions.setEncoding.
- Zippez les fichiers de données à l’aide de la méthode Archive.save et passez-lui le flux de fichiers créé à l’étape 1 et l’instance de ArchiveSaveOptions créée à l’étape précédente.
1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "StoreMultipleFilesWithoutCompression_out.zip")) {
2 Fichier fi1 = nouveau Fichier(dataDir + "alice29.txt") ;
3 Fichier fi2 = nouveau fichier (dataDir + "fields.c") ;
4 try (Archive archive = new Archive(new ArchiveEntrySettings(new StoreCompressionSettings()))) {
5 archive.createEntry("alice29.txt", fi1) ;
6 archive.createEntry("fields.c", fi2) ;
7 ArchiveSaveOptions options = new ArchiveSaveOptions() ;
8 options.setEncoding(StandardCharsets.US_ASCII) ;
9 archive.save(zipFile, options) ;
10 }
11} catch (IOException ignored) {
12 System.out.println(ex) ;
13}
Utilisation du parallélisme pour compresser les fichiers
Steps:Utiliser le parallélisme pour compresser des fichiers en utilisant Java
- Ouvrez un flux de sortie de fichier avec le nom souhaité de votre fichier zip de sortie.
- Ouvrez des flux d’entrée de fichiers pour vos premier et deuxième fichiers de données à compresser.
- Créez une instance de la classe Archive.
- Ajoutez les fichiers de données créés à l’étape 2 à l’aide de la méthode Archive.createEntry.
- Créer une instance de la classe ParallelOptions et définir ParallelCompressionMode.Always en utilisant la méthode ParallelOptions.setParallelCompressInMemory.
- Créer une instance de ArchiveSaveOptions et définir les options parallèles avec l’instance ci-dessus en utilisant la méthode ArchiveSaveOptions.setParallelOptions.
- Zippez les fichiers de données à l’aide de la méthode Archive.save et passez-lui le flux de fichiers créé à l’étape 1 et l’instance de ArchiveSaveOptions créée à l’étape précédente.
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 (Archive archive = new Archive(new ArchiveEntrySettings())) {
5 archive.createEntry("alice29.txt", source1) ;
6 archive.createEntry("asyoulik.txt", source2) ;
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("Il y a deux poèmes du corpus Canterbury") ;
13 archive.save(zipFile, options) ;
14 }
15 }
16 }
17} catch (IOException ex) {
18 System.out.println(ex) ;
19}
Compression LZMA dans une archive ZIP
L’algorithme Lempel-Ziv-Markov chain (LZMA) est un algorithme utilisé pour effectuer une compression de données sans perte. LZMA utilise un algorithme de compression par dictionnaire, le flux compressé est un flux de bits. La compression LZMA dans l’archive ZIP permet aux conteneurs ZIP de contenir des entrées compressées LZMA. L’exemple de code suivant montre la mise en œuvre de la compression LZMA à l’aide de l’API Aspose.ZIP.
Étapes:Compression LZMA dans une archive ZIP à l’aide de Java
- Ouvrez un flux de sortie de fichier avec le nom souhaité de votre fichier zip de sortie.
- Créez une instance de la classe ArchiveEntrySettings et passez-lui une instance de la classe LzmaCompressionSettings.
- Créez une instance de la classe Archive et transmettez-lui l’instance de ArchiveEntrySettings créée ci-dessus.
- Ajoutez les fichiers de données à compresser via les chemins d’accès aux fichiers à l’aide de la méthode Archive.createEntry.
- Zippez les fichiers de données à l’aide de la méthode Archive.save.
1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "LZMACompression_out.zip")) {
2 try (Archive archive = new Archive(new ArchiveEntrySettings(new LzmaCompressionSettings()))) {
3 archive.createEntry("sample.txt", dataDir + "sample.txt") ;
4 archive.save(zipFile) ;
5 }
6} catch (IOException ignored) {
7 System.out.println(ex) ;
8}
Compression BZip2 dans une archive ZIP
Les paramètres de compression BZip2 permettent au conteneur ZIP de contenir des entrées compressées BZip2. L’exemple de code suivant montre la mise en œuvre de la compression BZip2 à l’aide de l’API Aspose.ZIP.
Étapes:Compression BZip2 dans une archive ZIP à l’aide de Java
- Ouvrez un flux de sortie de fichier avec le nom souhaité de votre fichier zip de sortie.
- Créez une instance de la classe ArchiveEntrySettings et passez-lui une instance de la classe Bzip2CompressionSettings.
- Créez une instance de la classe Archive et transmettez-lui l’instance de ArchiveEntrySettings créée ci-dessus.
- Ajoutez les fichiers de données à compresser via les chemins d’accès aux fichiers à l’aide de la méthode Archive.createEntry.
- Zippez les fichiers de données à l’aide de la méthode Archive.save.
1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "Bzip2Compression_out.zip")) {
2 try (Archive archive = new Archive(new ArchiveEntrySettings(new Bzip2CompressionSettings()))) {
3 archive.createEntry("sample.txt", dataDir + "sample.txt") ;
4 archive.save(zipFile) ;
5 }
6} catch (IOException ignored) {
7 System.out.println(ex) ;
8}
Décompression des archives
Décompression d’une archive en un seul fichier
1try (FileInputStream fs = new FileInputStream(dataDir + "CompressSingleFile_out.zip")) {
2 try (Archive archive = new Archive(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 + "% decompressed") ;
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}
Décompression d’une archive contenant plusieurs fichiers
1try (FileInputStream fs = new FileInputStream(dataDir + "CompressMultipleFiles_out.zip")) {
2 StringBuilder sb = new StringBuilder("Les entrées sont : ") ;
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 + "% compressed") ;
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 extracted = new FileOutputStream(dataDir + "alice_extracted_out.txt")) {
26 try (InputStream decompressed = 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 extracted.write(buffer, 0, bytesRead) ;
31 }
32 // Lecture du flux décompressé dans le fichier d'extraction.
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}
Extraire une archive stockée sans compression
1try (FileInputStream zipFile = new FileInputStream(dataDir + "StoreMultipleFilesWithoutCompression_out.zip")) {
2 try (Archive 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 extrait.write(buffer, 0, bytesRead) ;
9 }
10 // Lecture du flux stocké vers le fichier d'extraction.
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 extrait.write(buffer, 0, bytesRead) ;
19 }
20 // Lecture du flux stocké vers le fichier d'extraction.
21 }
22 }
23 }
24} catch (IOException ex) {
25 System.out.println(ex) ;
26}