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 Também na biblioteca
Crossbeam para Rust: guia completo com exemplos práticos
Cliente HTTP para Go (Golang): as melhores bibliotecas para trabalhar com rede
Trabalho com ZIP/arquivos em C++: bibliotecas libzip e zlib
Trabalhando com YAML em C++: bibliotecas yaml-cpp e rapidyaml
Trabalhando com CSV em PHP: biblioteca PhpSpreadsheet