Pourquoi travailler avec des fichiers en Kotlin n'est pas douloureux
\n\nImaginez : vous écrivez une application qui doit sauvegarder les paramètres utilisateur, journaliser les erreurs ou traiter des fichiers CSV avec des milliers de lignes. En Java, des dizaines de classes BufferedReader, FileWriter et d'innombrables try-catch s'en chargent. Et en Kotlin ? Le langage créé par JetBrains ne se contente pas de « simplifier » Java — il repense la gestion des données. Ici, les fichiers s'ouvrent en une seule ligne, et les erreurs sont traitées avec élégance.
Dans cet article, nous allons explorer le travail avec les fichiers et le système de fichiers en Kotlin, des opérations de base aux techniques avancées. Vous apprendrez à lire et écrire des fichiers, gérer des répertoires, travailler avec JSON et CSV, et éviter les erreurs courantes. Prêt ? C'est parti !
\n\nLes bases : comment Kotlin simplifie la Java IO
\n\nLa principale caractéristique de Kotlin réside dans les fonctions d'extension. Au lieu d'écrire des dizaines de lignes pour lire un fichier, vous utilisez une seule fonction .readText() ou .readLines(). Regardons des exemples concrets.
Lecture complète d'un fichier
\nLa façon la plus simple de lire un fichier texte est d'utiliser readText(). Cette méthode retourne une chaîne contenant le contenu du fichier. Important : le fichier se ferme automatiquement après la lecture.
import java.io.File\n\nfun main() {\n val content = File("example.txt").readText()\n println(content)\n}\n\nSi le fichier est volumineux, il est préférable de lire ligne par ligne :
\n\nval lines = File("example.txt").readLines()\nlines.forEach { line -> println(line) }\n\nEt si vous devez lire en flux (par exemple, pour traiter de gros journaux) :
\n\nFile("example.txt").useLines { lines ->\n lines.forEach { line ->\n // Traitement de chaque ligne\n println(line)\n }\n}\n\nRemarquez useLines() — c'est une fonction qui garantit la fermeture de la ressource après la fin du bloc. Cela semble magique, mais fonctionne comme try-with-resources en Java, en plus court.
Écriture dans un fichier
\nL'écriture de données en Kotlin est également intuitive. Voici trois options :
\n\n// 1. Écraser le fichier\nFile("output.txt").writeText("Bonjour, le monde !")\n\n// 2. Ajouter à la fin du fichier\nFile("output.txt").appendText("Nouvelle ligne\\n")\n\n// 3. Écrire une liste de chaînes\nval list = listOf("ligne1", "ligne2", "ligne3")\nFile("output.txt").writeText(list.joinToString("\\n"))\n\nD'ailleurs, si vous travaillez avec des données binaires (images, archives), utilisez writeBytes() et readBytes() :
val imageBytes = File("image.png").readBytes()\n// Traitement des octets...\nFile("copy.png").writeBytes(imageBytes)\n\nGestion du système de fichiers : création, suppression, déplacement
\n\nKotlin ne réinvente pas la roue, mais rend la gestion du système de fichiers plus pratique. Toutes les opérations sont disponibles via la classe java.io.File avec des extensions.
Création de répertoires
\nPour créer un répertoire (et tous les répertoires parents s'ils n'existent pas) :
\n\nval dir = File("data/logs/2024")\nval created = dir.mkdirs() // Retourne true si créé\nprintln("Répertoire créé : $created")\n\nRemarque : mkdir() crée uniquement le dernier dossier, tandis que mkdirs() crée toute la chaîne.
Vérification d'existence et suppression
\n\nval file = File("temp.txt")\nif (file.exists()) {\n if (file.delete()) {\n println("Fichier supprimé")\n } else {\n println("Impossible de supprimer")\n }\n}\n\n// Suppression récursive d'un répertoire\nFile("data").deleteRecursively()\n\nSoyez prudent avec deleteRecursively() — c'est une opération irréversible. Vérifiez deux fois que vous supprimez les bonnes données.
Déplacement et copie
\n\nval source = File("old.txt")\nval target = File("new_dir/new.txt")\n\n// Déplacement (dé