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

  1. Cree un flujo de salida de archivo con el nombre deseado de su archivo zip de salida.
  2. Cree un flujo de entrada de archivos del archivo de datos a comprimir.
  3. Crear una instancia de la clase Archive y pasarle una instancia de la clase ArchiveEntrySettings.
  4. A�adir el fichero de datos creado en el paso 2 mediante el m�todo Archive.createEntry.
    1. 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

<a name=“java-comprimiendo-m�ltiples-archivos” id=“java-comprimiendo-m�ltiples-archivos”>Pasos:Comprimiendo m�ltiples archivos en Java

  1. Cree un flujo de archivos con el nombre deseado de su archivo zip de salida.
  2. Crear flujo de archivos del primer archivo de datos a comprimir.
  3. Crear flujo de archivos del segundo archivo de datos a comprimir.
  4. Crear una instancia de la clase Archivo.
  5. A�adir los ficheros de datos creados en los pasos 2 y 3 mediante el m�todo Archive.createEntry.
  6. Crear una instancia de la clase ArchiveSaveOptions.
  7. 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

  1. Abra un flujo de salida de archivos con el nombre deseado de su archivo zip de salida.
  2. Cree el objeto Archivo de su primer archivo de datos a comprimir.
    1. Cree el objeto Fichero de su segundo fichero de datos a comprimir.
  3. Crear una instancia de la clase Archivo.
  4. A�ade los ficheros de datos creados en los pasos 2 y 3 mediante el m�todo Archive.createEntry.
  5. Crear una instancia de la clase ArchiveSaveOptions.
    1. 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

<a name=“java-almacenamiento-de-archivos-a-archivos-sin-compresi�n” id=“java-almacenamiento-de-archivos-a-archivos-sin-compresi�n”>Pasos: Almacenamiento de archivos a archivos sin compresi�n usando Java

  1. Abra un flujo de salida de archivos con el nombre deseado de su archivo zip de salida.
  2. Cree objetos Archivo para sus ficheros de datos que se almacenar�n en el archivo.
    1. Crear una instancia de la clase ArchiveEntrySettings y pasarle una instancia de la clase StoreCompressionSettings.
  3. Crear una instancia de la clase Archive y pasarle la instancia de la clase ArchiveEntrySettings creada en el paso anterior.
  4. A�ada los objetos File creados en el paso 2 utilizando el m�todo Archive.createEntry.
  5. Crear una instancia de ArchiveSaveOptions y establecer la codificaci�n a StandardCharsets.US_ASCII utilizando el m�todo ArchiveSaveOptions.setEncoding.
    1. 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

  1. Abra un flujo de salida de archivos con el nombre deseado de su archivo zip de salida.
  2. Abra flujos de entrada de archivos para su primer y segundo archivo de datos a comprimir.
  3. Cree una instancia de la clase Archive.
  4. A�ada los ficheros de datos creados en el paso 2 utilizando el m�todo Archive.createEntry.
    1. Crear una instancia de ParallelOptions y establecer ParallelCompressionMode.Always utilizando el m�todo ParallelOptions.setParallelCompressInMemory.
  5. Crear una instancia de ArchiveSaveOptions y establecer las opciones paralelas con la instancia anterior utilizando el m�todo ArchiveSaveOptions.setParallelOptions.
    1. 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

  1. Abra un flujo de salida de archivos con el nombre deseado de su archivo zip de salida.
  2. Crear una instancia de la clase ArchiveEntrySettings y pasarle una instancia de la clase LzmaCompressionSettings.
  3. Cree una instancia de la clase Archive y p�sele la instancia de ArchiveEntrySettings creada anteriormente.
  4. A�adir los ficheros de datos a comprimir mediante rutas de fichero utilizando el m�todo Archive.createEntry.
    1. 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

  1. Abra un flujo de salida de archivos con el nombre deseado de su archivo zip de salida.
    1. Crear una instancia de la clase ArchiveEntrySettings y pasarle una instancia de la clase Bzip2CompressionSettings.
  2. Crear una instancia de la clase Archive y pasarle la instancia de ArchiveEntrySettings creada anteriormente.
  3. A�adir los ficheros de datos a comprimir mediante rutas de fichero utilizando el m�todo Archive.createEntry.
    1. 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                    extrado.escribir(bfer, 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                    extrado.escribir(bfer, 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                    extrado.escribir(bfer, 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}
Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.