Trabajo con archivos ZIP en Kotlin: guía completa
En el desarrollo moderno con Kotlin (JVM), a menudo surge la necesidad de comprimir o descomprimir archivos. La biblioteca estándar de Java proporciona potentes herramientas para trabajar con el formato ZIP a través del paquete java.util.zip. En este artículo, analizaremos en detalle cómo crear, leer y modificar archivos ZIP utilizando Kotlin y las capacidades integradas de la JVM.
Clases principales para trabajar con ZIP
Para trabajar con archivos ZIP en Kotlin se utilizan las siguientes clases de java.util.zip:
- ZipOutputStream — para crear nuevos archivos ZIP y agregarles archivos.
- ZipInputStream — para leer secuencialmente el contenido del archivo (modo flujo).
- ZipFile — para acceso aleatorio a las entradas del archivo.
- ZipEntry — representa una entrada individual (archivo o directorio) dentro del archivo ZIP.
Todas estas clases forman parte de la biblioteca estándar del JDK, por lo que no se requieren dependencias adicionales.
Creación de un archivo ZIP
Para crear un archivo se utiliza ZipOutputStream, que envuelve un FileOutputStream. Cada archivo se agrega a través de ZipEntry.
import java.io.Fileimport java.io.FileInputStreamimport java.io.FileOutputStreamimport java.util.zip.ZipEntryimport java.util.zip.ZipOutputStream
fun createZipArchive(sourceDir: String, zipFilePath: String) { val dir = File(sourceDir) val files = dir.listFiles() ?: return ZipOutputStream(FileOutputStream(zipFilePath)).use { zos -> for (file in files) { if (file.isFile) { // Creamos una entrada con el nombre del archivo val entry = ZipEntry(file.name) zos.putNextEntry(entry) // Copiamos el contenido del archivo FileInputStream(file).use { fis -> fis.copyTo(zos) } zos.closeEntry() } } } println("Archivo creado: $zipFilePath")}
// Ejemplo de llamadafun main() { createZipArchive("/ruta/a/origen", "/ruta/a/archivo.zip")}Extracción de un archivo ZIP
La extracción se realiza mediante ZipInputStream. Leemos cada entrada y restauramos los archivos en el disco.
import java.io.Fileimport java.io.FileInputStreamimport java.io.FileOutputStreamimport java.util.zip.ZipInputStream
fun extractZipArchive(zipFilePath: String, outputDir: String) { val outputFolder = File(outputDir).also { it.mkdirs() } ZipInputStream(FileInputStream(zipFilePath)).use { zis -> var entry = zis.nextEntry while (entry != null) { val fileName = entry.name val outputFile = File(outputFolder, fileName) // Creamos los directorios padre si es necesario outputFile.parentFile?.mkdirs() // Extraemos solo archivos (no directorios) if (!entry.isDirectory) { FileOutputStream(outputFile).use { fos -> zis.copyTo(fos) } } entry = zis.nextEntry } } println("Archivo extraído en: $outputDir")}
// Ejemplo de llamadafun main() { extractZipArchive("/ruta/a/archivo.zip", "/ruta/a/extraer")}Lectura del contenido del archivo sin extracción
Para ver los archivos dentro de un ZIP sin extraerlos, use ZipFile e itere sobre entries().
import java.io.Fileimport java.util.zip.ZipFile
fun listZipContents(zipFilePath: String) { ZipFile(File(zipFilePath)).use { zipFile -> println("Contenido del archivo: ${zipFile.name}") println("Total de entradas: ${ También en la biblioteca
Cliente Redis para C# (.NET): StackExchange.Redis — conexión y ejemplos
Programación reactiva en Rust: bibliotecas, frameworks y ejemplos prácticos
Limitación de tasa en C++: bibliotecas y herramientas para control de solicitudes
Generación de códigos QR en Node.js: biblioteca qrcode y ejemplos
gRPC para C# (.NET): bibliotecas, configuración y ejemplos de código