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 { Aussi dans la bibliothèque
Travailler avec Excel en C++ : bibliothèques et outils pour lire et écrire
Parsing HTML en Swift (iOS/macOS) : bibliothèques SwiftSoup et Fuzi
Surveillance des applications TypeScript : outils et pratiques
Envoi de SMS en C++ : API bibliothèque LibCurl et requêtes REST