Cómo comprimir y descomprimir archivos en Java
Visión general
Este artículo le enseñará a comprimir archivos Zip mediante programación utilizando diversos métodos con la API de Java y código de ejemplo. Aprenderá a comprimir uno o más archivos, así como a comprimir archivos simultáneamente. También aprenderá a descomprimir o descomprimir archivos.
Comprimir o descomprimir archivos en Java y descomprimir o descomprimir archivos en Java
La API Aspose.ZIP permite comprimir y descomprimir archivos sin preocuparse de la estructura de archivos subyacente. Este artículo muestra cómo trabajar con la compresión de archivos simples y múltiples.
Comprimir archivos
**Compresión de un solo archivo
Pasos: Comprimir un solo archivo en Java
- Cree un flujo de salida de archivo con el nombre deseado de su archivo zip de salida.
- Cree un flujo de entrada de archivos del archivo de datos a comprimir.
- Crear una instancia de la clase Archive y pasarle una instancia de la clase ArchiveEntrySettings.
- Añadir el fichero de datos creado en el paso 2 mediante el método Archive.createEntry.
- Comprima el archivo de datos utilizando el método Archive.save y pásele el flujo de archivos creado en el paso 1.
1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "CompressSingleFile_out.zip")) {
2 //Archivo a añadir al archivo
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}
Compresión de varios archivos
Pasos:Comprimiendo múltiples archivos en Java
- Cree un flujo de archivos con el nombre deseado de su archivo zip de salida.
- Crear flujo de archivos del primer archivo de datos a comprimir.
- Crear flujo de archivos del segundo archivo de datos a comprimir.
- Crear una instancia de la clase Archivo.
- Añadir los ficheros de datos creados en los pasos 2 y 3 mediante el método Archive.createEntry.
- Crear una instancia de la clase ArchiveSaveOptions.
- Comprima los ficheros de datos utilizando el método Archive.save y pásele el flujo de ficheros creado en el paso 1 y la instancia de ArchiveSaveOptions creada en el paso anterior.
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("Hay dos poemas del corpus Canterbury");
10 archive.save(zipFile, options);
11 }
12 }
13 }
14} catch (IOException ex) {
15 System.out.println(ex);
16}
Comprimir archivos por información de archivo
Pasos:Comprimir archivos por información de archivo en Java
- Abra un flujo de salida de archivos con el nombre deseado de su archivo zip de salida.
- Cree el objeto Archivo de su primer archivo de datos a comprimir.
- Cree el objeto Fichero de su segundo fichero de datos a comprimir.
- Crear una instancia de la clase Archivo.
- Añade los ficheros de datos creados en los pasos 2 y 3 mediante el método Archive.createEntry.
- Crear una instancia de la clase ArchiveSaveOptions.
- Comprima los ficheros de datos utilizando el método Archive.save y pásele el flujo de ficheros creado en el paso 1 y la instancia de ArchiveSaveOptions creada en el paso anterior.
1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "CompressFilesByFileInfo_out.zip")) {
2 File fi1 = new File(dataDir + "alice29.txt");
3 Archivo fi2 = nuevo Archivo(dataDir + "fields.c");
4 try (Archivo archive = nuevo Archivo()) {
5 archive.createEntry("alice29.txt", fi1);
6 archive.createEntry("campos.c", fi2);
7 ArchiveSaveOptions options = new ArchiveSaveOptions();
8 options.setEncoding(StandardCharsets.US_ASCII);
9 archive.save(zipFile, options);
10 }
11} catch (IOException ignorada) {
12 System.out.println(ex);
13}
Almacenamiento de ficheros en archivos sin compresión
Pasos: Almacenamiento de archivos a archivos sin compresión usando Java
- Abra un flujo de salida de archivos con el nombre deseado de su archivo zip de salida.
- Cree objetos Archivo para sus ficheros de datos que se almacenarán en el archivo.
- Crear una instancia de la clase ArchiveEntrySettings y pasarle una instancia de la clase StoreCompressionSettings.
- Crear una instancia de la clase Archive y pasarle la instancia de la clase ArchiveEntrySettings creada en el paso anterior.
- Añada los objetos File creados en el paso 2 utilizando el método Archive.createEntry.
- Crear una instancia de ArchiveSaveOptions y establecer la codificación a StandardCharsets.US_ASCII utilizando el método ArchiveSaveOptions.setEncoding.
- Comprima los archivos de datos utilizando el método Archive.save y pásele el flujo de archivos creado en el paso 1 y la instancia de ArchiveSaveOptions creada en el paso anterior.
1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "StoreMultipleFilesWithoutCompression_out.zip")) {
2 File fi1 = new File(dataDir + "alice29.txt");
3 Archivo fi2 = new Archivo(dataDir + "campos.c");
4 try (Archive archive = new Archive(new ArchiveEntrySettings(new StoreCompressionSettings()))) {
5 archive.createEntry("alice29.txt", fi1);
6 archive.createEntry("campos.c", fi2);
7 ArchiveSaveOptions options = new ArchiveSaveOptions();
8 options.setEncoding(StandardCharsets.US_ASCII);
9 archive.save(zipFile, options);
10 }
11} catch (IOException ignorada) {
12 System.out.println(ex);
13}
Usando Paralelismo para Comprimir Ficheros
Pasos: Usando Paralelismo para Comprimir Ficheros usando Java
- Abra un flujo de salida de archivos con el nombre deseado de su archivo zip de salida.
- Abra flujos de entrada de archivos para su primer y segundo archivo de datos a comprimir.
- Cree una instancia de la clase Archive.
- Añada los ficheros de datos creados en el paso 2 utilizando el método Archive.createEntry.
- Crear una instancia de ParallelOptions y establecer ParallelCompressionMode.Always utilizando el método ParallelOptions.setParallelCompressInMemory.
- Crear una instancia de ArchiveSaveOptions y establecer las opciones paralelas con la instancia anterior utilizando el método ArchiveSaveOptions.setParallelOptions.
- Comprima los archivos de datos utilizando el método Archive.save y pásele el flujo de archivos creado en el paso 1 y la instancia de ArchiveSaveOptions creada en el paso anterior.
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("Hay dos poemas del corpus Canterbury");
13 archive.save(zipFile, options);
14 }
15 }
16 }
17} catch (IOException ex) {
18 System.out.println(ex);
19}
Compresión LZMA dentro de un archivo ZIP
El algoritmo de cadena Lempel-Ziv-Markov (LZMA) es un algoritmo utilizado para realizar compresión de datos sin pérdidas. LZMA utiliza un algoritmo de compresión de diccionario, el flujo comprimido es un flujo de bits. La compresión LZMA dentro del archivo ZIP permite que los contenedores ZIP contengan entradas comprimidas con LZMA. El siguiente ejemplo de código muestra la implementación de la compresión LZMA utilizando la API Aspose.ZIP.
Pasos: Compresión LZMA dentro de un archivo ZIP usando Java
- Abra un flujo de salida de archivos con el nombre deseado de su archivo zip de salida.
- Crear una instancia de la clase ArchiveEntrySettings y pasarle una instancia de la clase LzmaCompressionSettings.
- Cree una instancia de la clase Archive y pásele la instancia de ArchiveEntrySettings creada anteriormente.
- Añadir los ficheros de datos a comprimir mediante rutas de fichero utilizando el método Archive.createEntry.
- Comprima los ficheros de datos utilizando el método Archive.save.
1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "LZMACompression_out.zip")) {
2 try (Archive archive = new Archive(new ArchiveEntrySettings(new LzmaCompressionSettings()))) {
3 archive.createEntry("muestra.txt", dataDir + "muestra.txt");
4 archive.save(zipFile);
5 }
6} catch (IOException ignored) {
7 System.out.println(ex);
8}
Compresión BZip2 dentro de un archivo ZIP
La configuración de compresión BZip2 permite que el contenedor ZIP contenga entradas comprimidas con BZip2. El siguiente ejemplo de código muestra la implementación de la compresión BZip2 utilizando Aspose.ZIP API.
Pasos: Compresión BZip2 dentro de un archivo ZIP usando Java
- Abra un flujo de salida de archivos con el nombre deseado de su archivo zip de salida.
- Crear una instancia de la clase ArchiveEntrySettings y pasarle una instancia de la clase Bzip2CompressionSettings.
- Crear una instancia de la clase Archive y pasarle la instancia de ArchiveEntrySettings creada anteriormente.
- Añadir los ficheros de datos a comprimir mediante rutas de fichero utilizando el método Archive.createEntry.
- Comprima los ficheros de datos utilizando el método Archive.save.
1try (FileOutputStream zipFile = new FileOutputStream(dataDir + "Bzip2Compression_out.zip")) {
2 try (Archive archive = new Archive(new ArchiveEntrySettings(new Bzip2CompressionSettings()))) {
3 archive.createEntry("muestra.txt", dataDir + "muestra.txt");
4 archive.save(zipFile);
5 }
6} catch (IOException ignored) {
7 System.out.println(ex);
8}
Descompresión de archivos
**Descomprimir archivo con un solo fichero
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(porcentaje + "% descomprimido");
12 percentReady[0] = porcentaje;
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}
Descomprimir archivo con varios ficheros
1try (FileInputStream fs = new FileInputStream(dataDir + "CompressMultipleFiles_out.zip")) {
2 StringBuilder sb = new StringBuilder("Las entradas son: ");
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(porcentaje + "% comprimido");
19 percentReady[0] = porcentaje;
20 }
21 }
22 });
23 try (Archivo = nuevo Archivo(fs, opciones)) {
24 System.out.println(sb.substring(0, sb.length() - 2));
25 try (FileOutputStream extracted = new FileOutputStream(dataDir + "alice_extracted_out.txt")) {
26 try (InputStream descomprimido = 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 extraído.escribir(búfer, 0, bytesRead);
31 }
32 // Leer del flujo descomprimido al archivo extraído.
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}
Extraer archivo almacenado sin compresión
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 extraído.escribir(búfer, 0, bytesRead);
9 }
10 // Leer del flujo almacenado al archivo extraído.
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 extraído.escribir(búfer, 0, bytesRead);
19 }
20 // Leer del flujo almacenado al archivo extraído.
21 }
22 }
23 }
24} catch (IOException ex) {
25 System.out.println(ex);
26}