Travailler avec les archives ZIP en Kotlin : guide complet
Dans le développement moderne avec Kotlin (JVM), il est souvent nécessaire de compresser ou décompresser des fichiers. La bibliothèque standard Java fournit des outils puissants pour travailler avec le format ZIP via le package java.util.zip. Dans cet article, nous allons détailler comment créer, lire et modifier des archives ZIP en utilisant Kotlin et les capacités intégrées de la JVM.
Classes principales pour la manipulation des ZIP
Pour travailler avec les archives ZIP en Kotlin, on utilise les classes suivantes de java.util.zip :
- ZipOutputStream — pour créer de nouvelles archives ZIP et y ajouter des fichiers.
- ZipInputStream — pour lire séquentiellement le contenu d'une archive (mode flux).
- ZipFile — pour un accès aléatoire aux entrées de l'archive.
- ZipEntry — représente une entrée individuelle (fichier ou répertoire) dans l'archive.
Toutes ces classes font partie de la bibliothèque standard JDK, donc aucune dépendance supplémentaire n'est nécessaire.
Création d'une archive ZIP
Pour créer une archive, on utilise ZipOutputStream, qui enveloppe un FileOutputStream. Chaque fichier est ajouté via 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) { // Créer une entrée avec le nom du fichier val entry = ZipEntry(file.name) zos.putNextEntry(entry) // Copier le contenu du fichier FileInputStream(file).use { fis -> fis.copyTo(zos) } zos.closeEntry() } } } println("Archive créée : $zipFilePath")}
// Exemple d'appelfun main() { createZipArchive("/chemin/vers/source", "/chemin/vers/archive.zip")}Extraction d'une archive ZIP
L'extraction se fait via ZipInputStream. On lit chaque entrée et on restaure les fichiers sur le disque.
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) // Créer les répertoires parents si nécessaire outputFile.parentFile?.mkdirs() // Extraire uniquement les fichiers (pas les répertoires) if (!entry.isDirectory) { FileOutputStream(outputFile).use { fos -> zis.copyTo(fos) } } entry = zis.nextEntry } } println("Archive extraite dans : $outputDir")}
// Exemple d'appelfun main() { extractZipArchive("/chemin/vers/archive.zip", "/chemin/vers/extraction")}Lecture du contenu d'une archive sans extraction
Pour visualiser les fichiers dans un ZIP sans les extraire, utilisez ZipFile et l'itération sur entries().
import java.io.Fileimport java.util.zip.ZipFile
fun listZipContents(zipFilePath: String) { ZipFile(File(zipFilePath)).use { zipFile -> println("Contenu de l'archive : ${zipFile.name}") println("Nombre total d'entrées : ${ Aussi dans la bibliothèque
Wolverine C# (.NET) : guide complet avec exemples
Bibliothèque GraphQL en C++ : implémentation d'API avec graphql-cpp
GraphQL en C++ : la bibliothèque cppgraphqlgen pour les API modernes
Files d'attente de tâches en Kotlin : Coroutines, KJob et modèles avancés
Autorisation et authentification en Rust : bibliothèques et outils