Trabalho com arquivos ZIP em Kotlin: guia completo
No desenvolvimento moderno em Kotlin (JVM), muitas vezes surge a necessidade de compactar ou descompactar arquivos. A biblioteca padrão do Java fornece ferramentas poderosas para trabalhar com o formato ZIP através do pacote java.util.zip. Neste artigo, abordaremos detalhadamente como criar, ler e modificar arquivos ZIP usando Kotlin e os recursos integrados da JVM.
Classes principais para trabalhar com ZIP
Para trabalhar com arquivos ZIP em Kotlin, são utilizadas as seguintes classes do java.util.zip:
- ZipOutputStream — para criar novos arquivos ZIP e adicionar arquivos a eles.
- ZipInputStream — para ler sequencialmente o conteúdo do arquivo (modo de fluxo).
- ZipFile — para acesso aleatório às entradas do arquivo.
- ZipEntry — representa uma entrada individual (arquivo ou diretório) dentro do arquivo.
Todas essas classes fazem parte da biblioteca padrão do JDK, portanto, nenhuma dependência adicional é necessária.
Criação de um arquivo ZIP
Para criar um arquivo, utiliza-se ZipOutputStream, que envolve um FileOutputStream. Cada arquivo é adicionado através de um 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) { // Cria uma entrada com o nome do arquivo val entry = ZipEntry(file.name) zos.putNextEntry(entry) // Copia o conteúdo do arquivo FileInputStream(file).use { fis -> fis.copyTo(zos) } zos.closeEntry() } } } println("Arquivo criado: $zipFilePath")}
// Exemplo de chamadafun main() { createZipArchive("/caminho/para/origem", "/caminho/para/arquivo.zip")}Extração de um arquivo ZIP
A extração é realizada através de ZipInputStream. Lemos cada entrada e restauramos os arquivos no 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) // Cria diretórios pai, se necessário outputFile.parentFile?.mkdirs() // Extrai apenas arquivos (não diretórios) if (!entry.isDirectory) { FileOutputStream(outputFile).use { fos -> zis.copyTo(fos) } } entry = zis.nextEntry } } println("Arquivo extraído em: $outputDir")}
// Exemplo de chamadafun main() { extractZipArchive("/caminho/para/arquivo.zip", "/caminho/para/extrair")}Leitura do conteúdo do arquivo sem extração
Para visualizar os arquivos dentro do ZIP sem extraí-los, utilize ZipFile e itere sobre entries().
import java.io.Fileimport java.util.zip.ZipFile
fun listZipContents(zipFilePath: String) { ZipFile(File(zipFilePath)).use { zipFile -> println("Conteúdo do arquivo: ${zipFile.name}") println("Total de entradas: ${