Comment lire un fichier texte depuis le dossier resources en Kotlin : tutoriel pas à pas
\n\nSalut, ami ! Si tu as déjà programmé en Kotlin pour Android ou simplement créé une application console, tu as sûrement rencontré une tâche simple mais piégeuse : comment lire un fichier texte qui se trouve dans le dossier resources ? Cela semble simple, non ? Mais si tu regardes sur Stack Overflow, la question "How to read a text file from resources in Kotlin?" cumule des milliers de vues. Le problème est donc bien réel.
Dans cet article, nous allons voir 5 méthodes fiables pour y parvenir. Tu découvriras la différence entre javaClass et ClassLoader, comment éviter un NullPointerException et que faire si ton projet est une bibliothèque plutôt qu'une application. C'est parti !
1. Préparation : où placer le fichier ?
\nAvant de lire, il faut placer le fichier au bon endroit. Dans un projet Kotlin standard (Gradle, Maven), le dossier des ressources se trouve généralement ici :
\n\nsrc/main/resources/\n\nPour les tests — src/test/resources/. Si tu as un projet Android, les ressources sont placées dans src/main/res/raw/ (mais avec sa propre logique, nous y reviendrons). Nous allons nous concentrer sur le Kotlin/JVM pur.
Créons un fichier simple data.txt avec le contenu suivant :
Bonjour le monde !\nCe sont des lignes provenant des ressources.\nKotlin déchire.\n\nParfait, l'outil est prêt. Voyons maintenant comment l'ouvrir.
\n\n2. Méthode n°1 : La classique via javaClass
\nLa méthode la plus populaire et intuitive consiste à utiliser javaClass (l'équivalent Kotlin de getClass() en Java).
import java.io.File\n\nfun readFromResources(fileName: String): String {\n val inputStream = this::class.java.classLoader?.getResourceAsStream(fileName)\n ?: throw IllegalArgumentException("Fichier $fileName introuvable dans les ressources")\n return inputStream.bufferedReader().readText()\n}\n\nAnalyse détaillée :
\n- \n
this::class.java— obtient la classe Java de l'objet courant. \n .classLoader— récupère le ClassLoader (chargeur de classes). \n getResourceAsStream(fileName)— ouvre le flux. \n - L'opérateur Elvis
?:lève une exception si le fichier n'existe pas. \n
Appel :
\nfun main() {\n val content = readFromResources("data.txt")\n println(content)\n}\n\nEn sortie, nous verrons les trois lignes de notre fichier. Simple et élégant.
\n\n3. Méthode n°2 : Utiliser un object pour les utilitaires
\nSi tu écris une classe utilitaire, il est pratique de placer la logique dans un object (singleton). En Kotlin, cela se fait ainsi :
object ResourceReader {\n fun readText(fileName: String): String {\n val stream = ResourceReader::class.java.classLoader\n .getResourceAsStream(fileName)\n ?: throw FileNotFoundException("Ressource $fileName introuvable")\n return stream.bufferedReader().readText()\n }\n}\n\n// Utilisation :\nfun main() {\n val text = ResourceReader.readText("config.json")\n println(text)\n}\n\nRemarque : nous utilisons ResourceReader::class.java — cela fonctionne car un object est un singleton qui possède une classe.
4. Méthode n°3 : Lire en tant qu'URL (pour obtenir le chemin)
\nParfois, on a besoin non pas du contenu, mais du chemin vers le fichier (par exemple, pour le passer à une autre bibliothèque). On utilise alors getResource() :
fun getResourcePath(fileName: String): String {\n val url = this::class.java.classLoader.getResource(fileName)\n ?: throw RuntimeException("Ressource $fileName introuvable")\n return url.path\n}\n\nMais attention : si le projet est empaqueté dans un JAR, url.path peut pointer à l'intérieur de l'archive, et File ne pourra pas le lire. Dans ce cas, il est préférable de toujours utiliser un flux (