Trabajo con archivos ZIP en Kotlin: guía completa
En el desarrollo moderno con Kotlin (especialmente para JVM y Android), a menudo surge la necesidad de trabajar con archivos ZIP: comprimir registros, descomprimir recursos, crear copias de seguridad o transferir datos en formato comprimido. En este artículo, analizaremos en detalle cómo trabajar con archivos ZIP en Kotlin, utilizando las capacidades integradas de Java (paquete java.util.zip), así como extensiones y alternativas convenientes.
¿Por qué es necesario trabajar con archivos en Kotlin?
- Ahorro de espacio — compresión de datos al almacenarlos en disco.
- Facilidad de transferencia — un solo archivo en lugar de múltiples archivos.
- Seguridad — posibilidad de cifrado (con bibliotecas adicionales).
- Trabajo con recursos — descompresión de configuraciones o actualizaciones.
Clases principales de Java para trabajar con ZIP
Kotlin es totalmente compatible con Java, por lo que para trabajar con archivos utilizamos las siguientes clases de java.util.zip:
ZipOutputStream— para crear un archivo.ZipInputStream— para leer un archivo.ZipEntry— representa un archivo/carpeta individual dentro del archivo.ZipFile— clase conveniente para leer un archivo existente.
Ejemplo 1: Creación de un archivo ZIP en Kotlin
Crearemos un archivo que contenga varios archivos y carpetas. Usaremos ZipOutputStream y BufferedOutputStream para mejorar el rendimiento.
import java.io.*import java.util.zip.*
fun createZipArchive( filesToZip: List<File>, outputZipPath: String) { ZipOutputStream(BufferedOutputStream(FileOutputStream(outputZipPath))).use { zos -> for (file in filesToZip) { if (file.isDirectory) { // Agregamos una carpeta vacía zos.putNextEntry(ZipEntry("${file.name}/")) zos.closeEntry() continue } // Agregamos un archivo val entry = ZipEntry(file.name) zos.putNextEntry(entry) FileInputStream(file).use { fis -> fis.copyTo(zos) } zos.closeEntry() } } println("Archivo creado: $outputZipPath")}
fun main() { val files = listOf( File("document.txt"), File("image.png"), File("configs") // carpeta ) createZipArchive(files, "output.zip")}Ejemplo 2: Lectura del contenido de un archivo ZIP
Para ver la lista de archivos dentro de un archivo, es conveniente usar ZipFile.
import java.util.zip.ZipFile
fun listZipContents(zipPath: String) { ZipFile(zipPath).use { zip -> println("Contenido del archivo $zipPath:") zip.entries().asSequence().forEach { entry -> val size = if (entry.isDirectory) "carpeta" else "${entry.size} bytes" println("- ${entry.name} ($size)") } }}
fun main() { listZipContents("output.zip")}Ejemplo 3: Descompresión de un archivo ZIP
Extraeremos todos los archivos del archivo a una carpeta especificada. Tenga en cuenta el manejo de subcarpetas.
import java.io.*import java.util.zip.ZipInputStream
fun extractZip( zipPath: String, outputDir: String = "extracted") { val destDir = File(outputDir) destDir.mkdirs()
ZipInputStream(BufferedInputStream(FileInputStream(zipPath))).use { zis -> var entry = zis.nextEntry while (entry != null) { val file = File(destDir, entry.name) if (entry.isDirectory) { file.mkdirs() } else { // Creamos las carpetas padre file.parentFile?.mkdirs() BufferedOutputStream(Fi