Trabajo con archivos ZIP en Java: guía completa de java.util.zip
El archivado de datos es una de las tareas básicas en el desarrollo de software. Java proporciona un conjunto de herramientas potente y flexible para trabajar con archivos ZIP "de fábrica" — el paquete java.util.zip. En este artículo, analizaremos en detalle cómo crear, extraer y modificar archivos ZIP utilizando las herramientas estándar de Java.
Clases principales del paquete java.util.zip
El paquete java.util.zip contiene las clases clave para trabajar con archivos:
- ZipOutputStream — para crear archivos ZIP (escribir archivos en el archivo)
- ZipInputStream — para leer y extraer archivos ZIP
- ZipEntry — representa una entrada individual (archivo/directorio) dentro del archivo
- ZipFile — para acceso directo al contenido del archivo sin extracción completa
- CheckedOutputStream / CheckedInputStream — para verificar la integridad de los datos (CRC32, Adler32)
Creación de un archivo ZIP (ZipOutputStream)
Para crear un archivo se utiliza ZipOutputStream, que envuelve un FileOutputStream normal. Cada archivo agregado se representa mediante un objeto ZipEntry.
import java.io.*;import java.util.zip.*;
public class CreateZip { public static void main(String[] args) throws IOException { String[] sourceFiles = {"file1.txt", "file2.txt", "image.png"}; String zipName = "archive.zip";
try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipName))) { byte[] buffer = new byte[1024];
for (String filePath : sourceFiles) { File file = new File(filePath); FileInputStream fis = new FileInputStream(file);
// Creamos una entrada en el archivo ZipEntry zipEntry = new ZipEntry(file.getName()); zos.putNextEntry(zipEntry);
// Escribimos el contenido del archivo int length; while ((length = fis.read(buffer)) > 0) { zos.write(buffer, 0, length); } zos.closeEntry(); fis.close(); System.out.println("Agregado: " + file.getName()); } } System.out.println("Archivo creado: " + zipName); }}Detalles importantes al crear un archivo:
- Llame siempre a
putNextEntry()antes de escribir datos y acloseEntry()después - Para agregar un directorio vacío, use
ZipEntry(name + "/")— el nombre debe terminar en "/" - Use try-with-resources para cerrar automáticamente los flujos
Extracción de un archivo ZIP (ZipInputStream)
Para extraer archivos de un archivo se utiliza ZipInputStream. La lectura se realiza secuencialmente — entrada por entrada.
import java.io.*;import java.util.zip.*;
public class ExtractZip { public static void main(String[] args) throws IOException { String zipFile = "archive.zip"; String outputDir = "extracted";
File dir = new File(outputDir); if (!dir.exists()) dir.mkdirs();
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) { ZipEntry entry; byte[] buffer = new byte[1024];
while ((entry = zis.getNextEntry()) != null) { String fileName = entry.getName(); File newFile = new File(outputDir + File.separator + fileName);
// Creamos los directorios padre new File(newFile.getParent()).mkdirs();
// Escribimos el archivo FileOutputStream fos = new FileOutputStream(newFile); int length;