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

2 Comentarios

Deja tu Comentario
  1. 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… :-)

  2. 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