Travailler avec les archives ZIP en Kotlin : guide complet
Dans le développement moderne avec Kotlin (notamment pour JVM et Android), il est souvent nécessaire de travailler avec des archives ZIP : compresser des journaux, décompresser des ressources, créer des sauvegardes ou transmettre des données sous forme compressée. Dans cet article, nous allons détailler comment travailler avec les archives ZIP en Kotlin, en utilisant les fonctionnalités intégrées de Java (package java.util.zip), ainsi que des extensions pratiques et des alternatives.
Pourquoi travailler avec des archives en Kotlin ?
- Économie d'espace — compression des données lors du stockage sur disque.
- Facilité de transmission — une seule archive au lieu de multiples fichiers.
- Sécurité — possibilité de chiffrement (avec des bibliothèques supplémentaires).
- Gestion des ressources — extraction de configurations ou de mises à jour.
Classes Java principales pour travailler avec ZIP
Kotlin est entièrement compatible avec Java, donc pour travailler avec les archives, nous utilisons les classes suivantes de java.util.zip :
ZipOutputStream— pour créer une archive.ZipInputStream— pour lire une archive.ZipEntry— représente un fichier/dossier individuel dans l'archive.ZipFile— classe pratique pour lire une archive existante.
Exemple 1 : Création d'une archive ZIP en Kotlin
Créons une archive contenant plusieurs fichiers et dossiers. Utilisons ZipOutputStream et BufferedOutputStream pour améliorer les performances.
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) { // Ajout d'un dossier vide zos.putNextEntry(ZipEntry("${file.name}/")) zos.closeEntry() continue } // Ajout d'un fichier val entry = ZipEntry(file.name) zos.putNextEntry(entry) FileInputStream(file).use { fis -> fis.copyTo(zos) } zos.closeEntry() } } println("Archive créée : $outputZipPath")}
fun main() { val files = listOf( File("document.txt"), File("image.png"), File("configs") // dossier ) createZipArchive(files, "output.zip")}Exemple 2 : Lecture du contenu d'une archive ZIP
Pour afficher la liste des fichiers dans une archive, il est pratique d'utiliser ZipFile.
import java.util.zip.ZipFile
fun listZipContents(zipPath: String) { ZipFile(zipPath).use { zip -> println("Contenu de l'archive $zipPath :") zip.entries().asSequence().forEach { entry -> val size = if (entry.isDirectory) "dossier" else "${entry.size} octets" println("- ${entry.name} ($size)") } }}
fun main() { listZipContents("output.zip")}Exemple 3 : Extraction d'une archive ZIP
Extrayons tous les fichiers de l'archive dans un dossier spécifié. Notez la gestion des sous-dossiers.
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 { // Création des dossiers parents file.parentFile?.mkdirs() BufferedOutputStream(Fi