Travailler avec les archives ZIP en Kotlin : création, lecture et extraction

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Travailler avec les archives ZIP en Kotlin



Dans le développement moderne avec Kotlin (que ce soit pour JVM ou Android), il est souvent nécessaire de compresser des fichiers dans des archives ZIP ou d'en extraire des données. La bibliothèque standard Java (java.util.zip) fournit toutes les classes nécessaires qui fonctionnent parfaitement avec Kotlin. Dans cet article, nous allons détailler trois opérations principales : la création d'une archive, la lecture du contenu et l'extraction de fichiers.



1. Création d'une archive ZIP (compression de fichiers)



Pour créer une archive, on utilise ZipOutputStream. Chaque fichier est ajouté comme une entrée séparée (ZipEntry). Voici un exemple qui compresse plusieurs fichiers dans une seule archive.



import java.io.Fileimport java.io.FileInputStreamimport java.io.FileOutputStreamimport java.util.zip.ZipEntryimport java.util.zip.ZipOutputStream

fun createZip( filesToZip: List<File>, outputZipFile: File) { ZipOutputStream(FileOutputStream(outputZipFile)).use { zipOut -> for (file in filesToZip) { // Créer une entrée avec le nom du fichier val entry = ZipEntry(file.name) zipOut.putNextEntry(entry)

// Lire le fichier source et l'écrire dans l'archive FileInputStream(file).use { fis -> fis.copyTo(zipOut) } zipOut.closeEntry() } }}

fun main() { val files = listOf( File("document.txt"), File("image.png"), File("data.json") ) val archive = File("my_archive.zip") createZip(files, archive) println("Archive créée : ${archive.absolutePath}")}


Notez l'utilisation de .use { ... } — c'est une fermeture sécurisée des ressources, équivalente à try-with-resources en Java. Si vous devez compresser des fichiers provenant de sous-répertoires, vous devrez parcourir récursivement les dossiers et conserver les chemins relatifs dans le nom du ZipEntry.



2. Lecture du contenu d'une archive (affichage de la liste des fichiers)



Parfois, on a seulement besoin de voir quels fichiers se trouvent dans une archive, sans les extraire. Pour cela, on utilise ZipFile ou ZipInputStream. La première option est plus pratique si l'archive existe déjà et n'est pas trop volumineuse.



import java.io.Fileimport java.util.zip.ZipFile

fun listZipContent(zipFile: File) { ZipFile(zipFile).use { zip -> val entries = zip.entries() while (entries.hasMoreElements()) { val entry = entries.nextElement() println("${entry.name} (${entry.size} octets)") } }}

fun main() { val archive = File("my_archive.zip") if (archive.exists()) { listZipContent(archive) } else { println("Fichier introuvable") }}


La méthode entries() retourne une énumération de toutes les entrées. Pour chaque entrée, on peut accéder au nom, à la taille, à la date de modification et aux indicateurs (par exemple, si l'entrée est un répertoire).



3. Extraction d'une archive ZIP (extraction de fichiers)



Pour extraire des fichiers, il est pratique d'utiliser ZipInputStream. Il lit l'archive séquentiellement, entrée par entrée. Voici un exemple d'extraction complète dans un dossier spécifié.



import java.io.Fileimport java.io.FileInputStreamimport java.io.FileOutputStreamimport java.util.zip.ZipInputStream

fun extractZip( zipFile: File, outputDir: File) { if (!outputDir.exists()) { outputDir.mkdirs() }

ZipInputStream(FileInputStream(zipFile)).use { zis -> var entry = zis.nextEntry while (entry != null) { val targetFile = File(outputDir, entry.name)

// Créer les répertoires parents si nécessaire targetFile.parentFile?.mkdirs()

// Si l'entrée est un répertoire, le créer simplement if (entry.isDirectory) { targetFile.mkdirs() } else {

Recommendations