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
<a name=“java-comprimiendo-m�ltiples-archivos” id=“java-comprimiendo-m�ltiples-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
<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
- 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}