Trabajo con archivos ZIP en Java: java.util.zip y Zip4j
La compresión y el archivado de datos es una de las tareas clave en el desarrollo de aplicaciones en Java. Los archivos ZIP se utilizan ampliamente para empaquetar archivos, transferir datos a través de la red y ahorrar espacio en disco. En este artículo, analizaremos en detalle dos enfoques principales para trabajar con archivos ZIP en Java: el paquete integrado java.util.zip y la potente biblioteca de terceros Zip4j.
El paquete estándar java.util.zip
Desde JDK 1.1, Java incluye el paquete java.util.zip, que proporciona clases básicas para trabajar con el formato ZIP. Las clases principales son:
ZipOutputStream— para crear archivos ZIPZipInputStream— para leer archivos ZIPZipEntry— representa una entrada individual (archivo o carpeta) dentro del archivoZipFile— para acceso aleatorio al contenido del archivo
Creación de un archivo ZIP con java.util.zip
import java.io.*;import java.util.zip.*;
public class ZipCreator { public static void main(String[] args) throws IOException { String sourceFile = "document.txt"; String zipName = "archive.zip";
try (FileOutputStream fos = new FileOutputStream(zipName); ZipOutputStream zos = new ZipOutputStream(fos)) {
File fileToZip = new File(sourceFile); FileInputStream fis = new FileInputStream(fileToZip);
ZipEntry zipEntry = new ZipEntry(fileToZip.getName()); zos.putNextEntry(zipEntry);
byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer)) >= 0) { zos.write(buffer, 0, length); } zos.closeEntry(); fis.close(); } System.out.println("Archivo creado: " + zipName); }}Extracción de un archivo ZIP
import java.io.*;import java.util.zip.*;
public class ZipExtractor { public static void main(String[] args) throws IOException { String zipFile = "archive.zip"; String outputDir = "extracted";
new File(outputDir).mkdirs();
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) { ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { File newFile = new File(outputDir, entry.getName()); new File(newFile.getParent()).mkdirs();
FileOutputStream fos = new FileOutputStream(newFile); byte[] buffer = new byte[1024]; int len; while ((len = zis.read(buffer)) > 0) { fos.write(buffer, 0, len); } fos.close(); zis.closeEntry(); } } System.out.println("Extracción completada en la carpeta: " + outputDir); }}Limitaciones de java.util.zip:
- Sin soporte para cifrado (protección por contraseña)
- Soporte limitado para Unicode en nombres de archivos (antes de Java 7)
- Sin soporte para ZIP64 en archivos > 4 GB (antes de Java 8)
- Dificultad para trabajar con subcarpetas
Biblioteca Zip4j — funcionalidades avanzadas
Zip4j es una popular biblioteca de terceros de código abierto que resuelve la mayoría de las limitaciones del paquete estándar. Para usarla, agregue la dependencia en Maven:
<dependency> <groupId>net.lingala.zip4j</groupId> <artifactId>zip4j</artifactId> <version>2.11.5</version></dependency>Creación de un archivo ZIP cifrado con Zip4j
import net.lingala.zip4j.ZipFile;import net.lingala.zip4j.model.ZipParam