Crear un archivo Zip con Java, comprimir y descomprimir datos
Escrito por
el .
java
planeta-codigo
programacion
Enlace permanente
Comentarios
Desde las primeras versiones de Java en el JDK se incluyen clases en el paquete java.util.zip que heredan de las del paquete java.io del sistema de entrada y salida con las que crear archivos comprimidos en formato Zip y comprimir datos en este formato. Comprimir los archivos que permite reducir sensiblemente el tamaño de algunos tipos de archivos como los basados en texto o ciertos archivos que de por si no están comprimidos. En otros tipos de archivo que en su formato ya están comprimidos como las imágenes JPEG o WebP la reducción de tamaño no es tan grande. Al contrario que los los algoritmos de compresión para imágenes JPEG y WebP que son com pérdida de datos, los algoritmos de compresión de archivos son sin pérdida, esto quiere decir que los datos obtenidos al comprimirlos y posteriormente descomprimirlos son exactamente los mismos que los originales.
Los archivos de texto o binarios no comprimidos comprimirlos supone un considerable reducción respecto del tamaño del archivo original no comprimido, un archivo XML del 20 MiB se puede quedar en 1.5 MiB, es decir, una tasa de compresión de 13 o lo que es lo mismo el fichero comprimido ocupa 13 veces menos.
Aparte del ahorro de espacio, crear un archivo Zip que agrupe varios es útil en ciertos casos. Las aplicaciones web como respuesta solo pueden devolver un archivo o documento por petición, un documento HTML, un recurso o un archivo. Para devolver varios archivos a la vez como una exportación de varios documentos dada la limitación del protocolo HTTP de petición y respuesta no es posible. Para dar solución a esta limitación normalmente se crea un archivo Zip que contenga los varios a devolver. Configurar los servidores web Nginx y Apache para comprimir los recursos minimiza los datos transferidos desde el servidor al cliente.
Contenido del artículo
Clases de Java para comprimir y descomprimir
Las clases del paquete java.util.zip permiten comprimir y descomprimir datos utilizando diferentes algoritmos. Se proporcionan soporte para el formato archivo Zip, GZIP, el algoritmo de compresión DEFLATE usando la librería ZLIB y otras clases para la corrección de errores o checksums.
Para la creación de archivos Zip las clases básicas son ZipEntry que representa un flujo de datos comprimido o archivo en un archivo Zip, ZipFile representa un archivo Zip, ZipInputStream que permite descomprimir los flujos de datos al leerlos y ZipOutputStream que permite comprimir flujos de datos.
Cómo crear un archivo Zip con Java
El siguiente código permite comprime varios archivos en diferentes formatos en un único archivo Zip. Este caso es el de una aplicación Java de línea de comandos, el código para una aplicación web consistiría en crear el archivo Zip y devolver como resultado el stream de ZipOutputStream de datos en el OutputStream empleado por la aplicación web para devolver el resultado al cliente.
Los archivos de extensión jar utilizados en Java para crear librerías y war para empaquetar aplicaciones web no son más que archivos Zip con estas extensiones.
|
|
|
|
Cómo descomprimir un archivo Zip con Java
El proceso contrario a la compresión es la descompresión, la descompresión permite recuperar los datos originales. Para esto se utiliza la clase ZipFile en el caso de leer de un archivo, la clase ZipInputStream también permite leer el Zip creado con ZipOutputStream.
|
|
|
|
Listar el contenido de un archivo Zip con Java
En Java el contenido de un ZipFile se representa con la clase ZipEntry, el siguiente código lista el contenido de un archivo Zip.
|
|
|
|
Usando la aplicación integrada en el entorno de escritorio o sistema operativo para visualizar el contenido del archivo Zip se observa que contiene comprimidos el conjunto de archivos añadidos en él.
O listar el contenido de un archivo Zip desde la linea de comandos.
|
|
Otros formatos de archivos comprimidos
Los algoritmos ofrecidos en la API de Java no son los únicos, hay otros con diferentes características. Zip es un formato de archivos comprimidos popular disponible en los sistemas operativos mayoritarios como Windows, GNU/Linux y macOS ofrecen soporte para comprimir y descomprimir archivos con este formato. Otro algoritmos distintos al Zip son mejores en varios aspectos, ofreciendo ratios de compresión mayores o con velocidades de compresión y descompresión mayores.
Algunos algoritmos de compresión alternativos son bzip2, lzma, lzo o zstd para los que Java no proporciona clases en el JDK y en algunos de ellos no hay ninguna librería que permite trabajar en Java con estos formatos de archivo. La única alternativa es ejecutar un proceso del sistema que invoque el comando del sistema para realizar la compresión, la descompresión o listar el contenido del archivo.
El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:./gradlew run