Trabalho com ZIP/arquivos em Kotlin: guia completo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalho com ZIP/arquivos em Kotlin: guia completo



No desenvolvimento moderno com Kotlin (especialmente para JVM e Android), surge frequentemente a necessidade de trabalhar com arquivos ZIP: compactar logs, descompactar recursos, criar backups ou transmitir dados de forma compactada. Neste artigo, abordaremos detalhadamente como trabalhar com arquivos ZIP em Kotlin, utilizando os recursos nativos do Java (pacote java.util.zip), além de explorar extensões convenientes e alternativas.



Por que trabalhar com arquivos em Kotlin?

  • Economia de espaço — compressão de dados ao armazenar em disco.
  • Facilidade de transmissão — um único arquivo em vez de vários.
  • Segurança — possibilidade de criptografia (com bibliotecas adicionais).
  • Trabalho com recursos — descompactação de configurações ou atualizações.


Principais classes Java para trabalhar com ZIP

Kotlin é totalmente compatível com Java, portanto, para trabalhar com arquivos, usamos as seguintes classes de java.util.zip:

  • ZipOutputStream — para criar um arquivo.
  • ZipInputStream — para ler um arquivo.
  • ZipEntry — representa um arquivo/pasta individual dentro do arquivo.
  • ZipFile — classe conveniente para ler um arquivo existente.


Exemplo 1: Criando um arquivo ZIP em Kotlin

Vamos criar um arquivo que contém vários arquivos e pastas. Usaremos ZipOutputStream e BufferedOutputStream para melhor desempenho.

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) { // Adiciona uma pasta vazia zos.putNextEntry(ZipEntry("${file.name}/")) zos.closeEntry() continue } // Adiciona o arquivo val entry = ZipEntry(file.name) zos.putNextEntry(entry) FileInputStream(file).use { fis -> fis.copyTo(zos) } zos.closeEntry() } } println("Arquivo criado: $outputZipPath")}

fun main() { val files = listOf( File("document.txt"), File("image.png"), File("configs") // pasta ) createZipArchive(files, "output.zip")}


Exemplo 2: Lendo o conteúdo de um arquivo ZIP

Para visualizar a lista de arquivos dentro de um arquivo, é conveniente usar ZipFile.

import java.util.zip.ZipFile

fun listZipContents(zipPath: String) { ZipFile(zipPath).use { zip -> println("Conteúdo do arquivo $zipPath:") zip.entries().asSequence().forEach { entry -> val size = if (entry.isDirectory) "pasta" else "${entry.size} bytes" println("- ${entry.name} ($size)") } }}

fun main() { listZipContents("output.zip")}


Exemplo 3: Descompactando um arquivo ZIP

Extrairemos todos os arquivos do arquivo para uma pasta especificada. Observe o tratamento de subpastas.

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 { // Cria as pastas pai file.parentFile?.mkdirs() BufferedOutputStream(Fi

Recommendations