Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / Java / Compresión y descompresión de archivos con GZIP

Compresión y descompresión de archivos con GZIP

Por jc mouse miércoles, enero 30, 2019

En este post veremos un ejemplo de como comprimir y descomprimir archivos con el método de compresión GZIP  y el paquete de Java java.util.zip.*

gzip icon

java.util.zip: Este paquete ofrece clases para leer y escribir los formatos de archivo ZIP y GZIP estándar. También incluye clases para comprimir y descomprimir datos usando el algoritmo de compresión DEFLATE, que es usado por los formatos de archivo ZIP y GZIP. Además, tiene clases para calcular las sumas de comprobación CRC-32 y Adler-32 de flujos de entrada arbitrarios.

Nuestro proyecto consiste en una clase con dos métodos tanto para comprimir como descomprimir archivos.  La clase es la siguiente:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
/**
 * @see https://www.jc-mouse.net
 * @author mouse
 */
public class DemoGZIP {

    private final byte[] BUFFER = new byte[1024];

    /**
     * @param archivo Archivo a comprimir
     *      El archivo se comprime con el mismo nombre del archivo origen seguido de la extension *.zip
     * @return boolean 
     *      TRUE tuvo exito
     *      FALSE no se pudo comprimir
     */
    public boolean comprimir(File archivo) {                
        try (GZIPOutputStream  out = new GZIPOutputStream (new FileOutputStream(archivo.getAbsolutePath() + ".zip"));
                FileInputStream in = new FileInputStream(archivo)) {
            int len;
            while ((len = in.read(BUFFER)) != -1) {
                out.write(BUFFER, 0, len);
            }
            out.close();
        } catch (IOException ex) {
            System.err.println(ex.getMessage());
            return false;
        }
        return true;
    }

    /**
     * @param archivo Archivo a comprimir de la forma archivo.extension.zip
     * @return boolean 
     *      TRUE tuvo exito
     *      FALSE no se pudo descomprimir
     */
    public boolean descomprimir(File archivo) {
        //extrae la extension *.zip
        String salida = archivo.getAbsolutePath().replaceFirst("[.][^.]+$", "");        
        try (GZIPInputStream in = new GZIPInputStream(new FileInputStream(archivo));
                FileOutputStream out = new FileOutputStream(salida)) {            
            int len;
            while ((len = in.read(BUFFER)) != -1) {
                out.write(BUFFER, 0, len);
            }
            out.close();
        } catch (IOException ex) {      
            System.err.println(ex.getMessage());
            return false;
        }
        return true;
    }

}

Para probar nuestra clase, podemos hacerlo de la siguiente manera:

DemoGZIP demoGZIP = new DemoGZIP();
        if(demoGZIP.comprimir(new File("E:\\tmp\\presentacion.pptx"))){
            if(demoGZIP.descomprimir(new File("E:\\tmp\\presentacion.pptx.zip"))){
                System.out.println("completado...");
            }
        }

Esto creara un archivo comprimido «presentacion.pptx.zip» como podemos ver a continuación

gzip java file

Y si no obtuvimos ningún error la clase comprimirá el archivo y procederá a su descompresión.

enjoy!!!

Tags

Artículos similares

Formulario de login personalizado

Hola, en este oportunidad dejo a disposición un formulario de logueo que se me ocurrió de repente creo inspirado en las[...]

Interfaces Funcionales

Una Interface Funcional es una interface que contiene uno y solo un método abstracto aunque puede contener métodos por d[...]

Crea un Tabbed Activity desde cero

Un Tabbed Activity te permite cambiar la vista entre  fragmentos desplazando el dedo  de izquierda a derecha o de derech[...]

Obtener Metadatos de una base de datos con java

La clase de java DatabaseMetaData nos permite obtener información exhaustiva sobre una base de datos, para ser más exact[...]

Conectar C Sharp con MySQL

Ya tengo varios post sobre conexión a base de datos en varios lenguajes y claro no podía faltar c#, el siguiente tutoria[...]

CUF: Código Único de Factura

Este 2019 se implementara en Bolivia un nuevo Sistema de Facturación Electrónica con nuevas características y medidas de[...]