post icon

Comprimir y Descomprir archivos ZIP con Java

Es posible que querramos tener nuestro propio programa compresor de ficheros multiplataforma para utilizarlo, para ello podemos cumplir con el cometido gracias a Java y un poco de código.

El formato más estándar para hacerlo es el .ZIP (aunque no sea el de mejor compresión), para ellos crearemos una clase que reciba el nombre de los ficheros a crear y a zippear.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import java.util.zip.*;
import java.io.*;
 
/**
 *
 * @author GeekZero
 */
public class Archivos {
 
	private static final int BUFFER_SIZE = 1024;
 
        public void Zippear(String pFile, String pZipFile) throws Exception {
		// objetos en memoria
		FileInputStream fis = null;
		FileOutputStream fos = null;
		ZipOutputStream zipos = null;
 
		// buffer
		byte[] buffer = new byte[BUFFER_SIZE];
		try {
			// fichero a comprimir
			fis = new FileInputStream(pFile);
			// fichero contenedor del zip
			fos = new FileOutputStream(pZipFile);
			// fichero comprimido
			zipos = new ZipOutputStream(fos);
			ZipEntry zipEntry = new ZipEntry(pFile);
			zipos.putNextEntry(zipEntry);
			int len = 0;
			// zippear
			while ((len = fis.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 files
			zipos.close();
			fis.close();
			fos.close();
		} // end try
	} // end Zippear
 
	public void UnZip(String pZipFile, String pFile) throws Exception {
		BufferedOutputStream bos = null;
		FileInputStream fis = null;
		ZipInputStream zipis = null;
		FileOutputStream fos = null;
 
		try {
			fis = new FileInputStream(pZipFile);
			zipis = new ZipInputStream(new BufferedInputStream(fis));
			if (zipis.getNextEntry() != null) {
				int len = 0;
				byte[] buffer = new byte[BUFFER_SIZE];
				fos = new FileOutputStream(pFile);
				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("El zip no contenia fichero alguno");
			} // end if
		} catch (Exception e) {
			throw e;
		} finally {
			bos.close();
			zipis.close();
			fos.close();
			fis.close();
		} // end try
	} // end UnZip
 
        // ejemplo de uso
	public static void main(String[] args) throws Exception {
		try {
			Archivos arch = new Archivos();
			arch.Zippear("devtroce.jpg", "devtroce.zip");
			System.out.println("Comprimido!");
			arch.UnZip("devtroce.zip", "new_devtroce.jpg");
			System.out.println("Descomprimido!");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}// end class

Comentarios desde Facebook:

  1. avatar
    Daniel Vasquez UNITED STATES Google Chrome Windows
    24 diciembre 2013 at 06:16 #

    Muchas gracias, me funcionó muy bien y no pone la ruta completa dentro del zip cuando se inserta la linea 27 con el código que se comentó.

  2. avatar
    Ney VENEZUELA Google Chrome Windows
    24 octubre 2013 at 18:48 #

    Si a alguien le quedan dudas de como comprimir el archivo sin la estructura del directorio, hagan lo siguiente, inserten sobre la linea 27 esto:
    pFile = pFile.substring(pFile.lastIndexOf(“\”)+1);

    Saludos.

  3. avatar
    andres felipe Google Chrome Windows
    24 mayo 2013 at 12:28 #

    Amigo como hago para comprimir varios archivos a las ves. gracias¡

  4. avatar
    anne SPAIN Mozilla Firefox Windows
    5 marzo 2012 at 11:57 #

    Hola!

    muchas gracias, funciona genial. Pero sí que es verdad lo que dice Oscar…al crearte el zip te crea toda la ruta por dentro..y queda un poco feo.

    Dicho esto, he intentado solucionarlo pero no he conseguido nada…

    Si alguien nos puede ayudar… 🙂

    • avatar
      David Mozilla Firefox Windows
      26 septiembre 2012 at 15:16 #

      Para no crear toda la ruta dentro del zip, se tiene que hacer lo siguiente: modificar la línea 27 del código de arriba, agregar solo el nombre del fichero con su extensión dentro del constructor ZipEntry.

      Ejemplo:

      String pFile = “C:/temp/myFile.txt”
      String nameFile = pFile.replace(“C:/temp/”,””);

      ZipEntry zipEntry = new ZipEntry(nameFile);

      Nota: Todo lo demas debe dejarse igual.
      Con esto se crea el zip solo con el archivo sin la estructura de directorios donde se encuentra.

      • avatar
        miguel Google Chrome Windows
        7 mayo 2013 at 11:07 #

        hola no entiendo como pasarle la ruta para que me lea el archivo.txt o .sql y que lo convierta a .zip me aclaras mejor?

        • avatar
          Psep CHILE Mozilla Firefox Linux
          11 junio 2013 at 12:54 #

          Puedes darle las rutas a través de argumentos, esto gracias al método main -> String[] args.

    • avatar
      Daniel Vasquez UNITED STATES Google Chrome Windows
      24 diciembre 2013 at 06:20 #

      Hola, solo inserta este codigo en la linea 27:

      pFile = pFile.substring(pFile.lastIndexOf(“\”)+1);

      a mi me funcionó muy bien.
      Un saludo.

      • avatar
        Daniel Vasquez UNITED STATES Google Chrome Windows
        24 diciembre 2013 at 06:24 #

        Si estas en windows usas ‘\’ y en unix usas ‘/’, para solucionar esto usar el File.separator que coge el separador de directorios del sistema operativo:

        pFile = pFile.substring(pFile.lastIndexOf( File.separator )+1);

  5. avatar
    oscar M Google Chrome Windows
    11 noviembre 2011 at 01:05 #

    Muchas gracias, funciona, solamente tengo una dificultad que mi archivo esta una ruta determinada, la cual indico como parámetro de entrada, pero al crearse el archivo ZIP crea por dentro de este la misma ruta y deseo que “no tenga” ninguna ruta de salida. Estoy creando un archivo KMZ (Google earth) y así debe ser su estructura, simplmenete zipeado sin ruta y con nombre doc.kml

    Nuevamente Muchas Gracias

Responder