jueves, 13 de junio de 2013

Comprimir y Descomprimir archivos en formato ZIP [JAVA]


Antes de empezar es bueno incluir un poco de información acerca del formato ZIP:

En informáticaZIP o zip es un formato de almacenamiento sin pérdida, muy utilizado para la compresión de datos como documentos, imágenes o programas.Para este tipo de archivos se utiliza generalmente la extensión ".zip".Muchos programas, tanto comerciales como libres, lo utilizan y permiten su uso más habitual.

Considero que junto a el formato rar, son los formatos de compresión de archivos más utilizados. La máquina virtual de Java nos permite el manejo de este tipo de archivos. Con una clase que contenga los métodos de compresión / descompresión  podemos realizar fácilmente una aplicación portable y ligera que realice la compresión y descompresión de archivos desde nuestra memoria USB.

A continuación podemos ver el código para manejar archivos .ZIP

//Primero importar librerias para manejo de archivos y archivos zip
import java.util.zip.*;

import java.io.*;

public class ZIP {

private static final int BUFFER_SIZE = 1024;

        public void Comprimir(String archivoOriginal, String archivoZIP) throws Exception {
// bjetos en memoria
FileInputStream archivoEntrada = null;
FileOutputStream archivoSalida = null;
ZipOutputStream zipos = null;

// buffer
byte[] buffer = new byte[BUFFER_SIZE];
try {
// fichero entrada
archivoEntrada = new FileInputStream(archivoOriginal);
archivoSalida = new FileOutputStream(archivoZIP);
// fichero comprimido
zipos = new ZipOutputStream( archivoSalida);
ZipEntry zipEntry = new ZipEntry(archivoOriginal);
zipos.putNextEntry(zipEntry);
int len = 0;
// zippear
while ((len = archivoEntrada.read(buffer, 0, BUFFER_SIZE)) != -1)
zipos.write(buffer, 0, len);
// volcar la memoria al disco
zipos.flush();
} catch (Exception e) {
throw e;
} finally {
// cerramos los archivos
zipos.close();
archivoEntrada.close();
archivoSalida.close();
} // cerramos try.
} // cerramos Comprimir

public void Descomprimir(String archivoZIP, String archivoDescomprimido) throws Exception {
BufferedOutputStream bos = null;
FileInputStream fis = null;
ZipInputStream zipis = null;
FileOutputStream fos = null;

try {
fis = new FileInputStream(archivoZIP);
zipis = new ZipInputStream(new BufferedInputStream(fis));
if (zipis.getNextEntry() != null) {
int len = 0;
byte[] buffer = new byte[BUFFER_SIZE];
fos = new FileOutputStream(archivoDescomprimido);
bos = new BufferedOutputStream(fos, BUFFER_SIZE);

while  ((len = zipis.read(buffer, 0, BUFFER_SIZE)) != -1)
bos.write(buffer, 0, len);
bos.flush();
} else {
throw new Exception("Zip Vacio");
} // cierra if
} catch (Exception e) {
throw e;
} finally {
bos.close();
zipis.close();
fos.close();
fis.close();
} // cierra try

} // cierra descomprimir

Debemos entender que al comprimir ingresamos la ruta del archivo a comprimir como primer parámetro y la ruta del fichero resultante como segundo parámetro. En descomprimir es el orden contrario. Espero haber escrito las variables de manera entendible.

Para probar el código podemos crear una nueva Main Class o agregar esto al final.

                        ZIP archivo = new ZIP();
                        String archivoEntrada="imagen.jpg";//ruta del fichero original 
                        String archivoSalida="imagen.zip";//ruta del fichero generado
archivo.Comprimir(archivoEntrada, archivoSalida);
System.out.println("Comprimido en zip!");
                        archivoEntrada="imagen.zip";//ruta del fichero original 
                        archivoSalida="imagen2.jpg";//ruta del fichero generado
archivo.Descomprimir(archivoEntrada, archivoSalida);
System.out.println("ZIP Descomprimido!");

El texto resaltado corresponde a las rutas usadas para probar el programa. Debes colocar una imagen.jpg en tu proyecto al mismo nivel que la carpeta src o simplemente prueba con cualquier otra ruta.

Próximamente actualizaré la publicación compartiendo una aplicación gráfica que comprima y descomprima los archivos ZIP.

No hay comentarios:

Publicar un comentario