Generar un fichero GZIP con Java

31/Dic/2006 Java , , , 10 Comentarios

GZIP es la abreviatura de GNU ZIP. GZIP se basa en el algoritmo Deflate (combinación de los algoritmos LZ77 y Huffman). GZIP solor sirve para comprimir ficheros, pero no los comprime. Esto si que lo hace otras herramientas como ZIP. La idea es utilizar el lenguaje Java para generar un fichero GZIP a partir de un fichero de nuestros discos.

GZIP y ZIP son dos conceptos diferentes. GZIP comprime ficheros, mientras que ZIP comprime y archiva los ficheros.

Lo primero que tenemos que hacer es leer el fichero de origen. Para ello nos apoyaremos en las clases de Java IO. En concreto FileInputStream.

  1. String inFilename = "fichero.txt";
  2. FileInputStream in = new FileInputStream(inFilename);

A continuación deberemos de detallar cual va a ser el fichero de salida. En este caso nos apoyamos en las clases de Java ZIP de compresión. Usaremos GZIPOutputStream, a la cual le pasaremos por parámetro el fichero de salida, representado por la clase FileOutputStream, esta ultima de Java IO.

  1. String outFilename = "fichero.gzip";

Esto ya hace que lo que volquemos a GZIPOutputStream sea una codificación GZIP. A si que solo nos quedará ir leyendo del stream de entrada y volcarlo al stream de salida. Para ello nos apoyaremos en un buffer de 1024bytes.

  1. byte[] buf = new byte[1024];
  2. int len;
  3. while ((len = in.read(buf)) > 0) {
  4. out.write(buf, 0, len);
  5. }

Ya tenemos todo el contenido volcado sobre la salida comprimida. Solo nos quedará cerrar los ficheros, para eso usamos el método .close().

  1. out.finish();
  2. out.close();

Hay que recordar que siempre que manejamos ficheros con las clases de Java IO se puede producir una excepcion IOException. A si que todo nuestro código deberá de ir encerrado entre un bloque try-catch{}.

Vídeos sobre Java


10 comentarios en “Generar un fichero GZIP con Java”

Víctor Cuervo

lineadecodigo

@Lorecas,

No he conseguido seguir muy bien tu código… Alguna ayuda que necesites???

Víctor Cuervo

lineadecodigo

@Luis Antonio,

La idea es que repitas la acción de un fichero sobre todos los ficheros que haya en los directorios. Este código te ayudará

http://lineadecodigo.com/java/listar-un-directorio-de-forma-recursiva-en-java/

Si bien, cada vez que insertes un fichero tienes que utilizar la clase ZipEntry para indicarle que hay una nueva entrada en el fichero de compresión.

Nos ponemos a trabajar en el ejemplo para poder ayudarte y tener el código completo.

Víctor Cuervo

Lorecas

File dir = new File(path);
File[] ficheros = dir.listFiles();
if (ficheros == null) {
System.out.println(“No hay ficheros en el directorio especificado”);
} else {
for (int x = 0; x < ficheros.length; x++) {
if (!ficheros[x].isDirectory()) {
String nombre = ficheros[x].getName();
if (nombre.endsWith(".properties")) {
String properties = path + File.separator + nombre;
Properties prop = new Properties();
InputStream is = null;

try {
is = new FileInputStream(properties);
prop.load(is);
for (Enumeration e = prop.keys(); e.hasMoreElements();) {
// Obtenemos el objeto
Object obj = e.nextElement();
valoresProp.put(
obj, prop.getProperty(obj.toString()));
logger.info("el valor" + obj
+ " : " + prop.getProperty(obj.toString()));
}
} catch (IOException ioe) {
logger.info("Error al leer properties: " + ioe);
}
}
}
}

Víctor Cuervo

LUIS ANTONIO

Me he topado con un problema de compresión ZIP en JAVA. Hasta aquí he podido comprimir con ficheros, pero no con un directorio que dentro de ella incluye subdirectorios y ficheros en cada directorio. Espero que puedas ayudarme a generar una clase para comprimir directorios con java.util.zip;

Muchas gracias.

Víctor Cuervo

Lorecas

este es el codigo
protected List descomprimirPielEmpresaId(final Element requestElement) {
List res = null;
String fileName = null;
String empresaId = null;
try {
NodeList children = requestElement.getChildNodes();
Node child;

/* Recorremos los nodos del requestElement segun el Schema */
for (int i = 0; i < children.getLength(); i++) {
child = children.item(i);
if (child.getNodeType() == Node.ELEMENT_NODE) {
String prefix = child.getPrefix();
String nodeName = child.getNodeName();
String valor = child.getTextContent();
if (prefix != null && prefix.length() != 0) {
prefix = prefix + ":";
} else {
prefix = "";
}
if (nodeName.equals(prefix + "rutaArchivo")) {
fileName = valor;
} else if (nodeName.equals(prefix + "empresaId")) {
empresaId = valor;
}
}
}
res = yumbaService.descomprimirPielEmpresaId(
fileName, empresaId);
} catch (Exception ex) {
log.error("Excepcion descomprimir piel" + ex);
return null;
}
return res;
}

Víctor Cuervo

Lorecas

Hola necesito hacer esto:
Ir al servidor a travez de un web service y pedirle que busque un .zip, lo descomprima y me devuelva una lista de nombres de recursos que este posee.

Localmente funciona, pero cuando trato de probar de mi maquina trayendo desde el servidor no muestra nada. Me dicen que no le estoy pasando el archivo y que debo codificarlo primero como un string base64. No entiendo mucho, solo con pasarle la ruta donde esta el zip (en el mismo servidor, claro) no basta?

Víctor Cuervo

Emilio

Necesito saber todo lo relacionado con ficheros en Java es decir ejercicios resueltos explicandome como se hace pero en codigos de ficheros.

Víctor Cuervo

jlinkamp

Para Gabriela, en esta `´agina puedes encontrar un pequeño manual de como hacerlo

Espero que te sirva

http://openthedoorclosethewindows.wordpress.com/2008/01/16/pasos-para-crear-un-zip-en-java-sin-guardar-el-zip-en-un-directorio-temporal/

Víctor Cuervo

Esteban fridman

Aprediendo bien el concepto de POO .Hace un curso , es lo mejor que podes hacer

Víctor Cuervo

Gabriela

Estoy desarrollando una aplicación web y debo generar 5 archivos, pero sin guardarlos en el servidor, una vez que estos archivos son generados debo meterlos dentro de un zip ¿Sabes como se puede hacer esto?

¿Algo que nos quieras comentar?

Déjanos tu comentario, no te preocupes que tu email no será publicado

*

*