Trabajo con archivos ZIP en Kotlin: guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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

Recommendations