Wie man eine Textdatei aus dem Ordner resources in Kotlin liest: Schritt-für-Schritt-Tutorial
\n\nHallo, Freund! Wenn du jemals in Kotlin für Android entwickelt oder einfach eine Konsolenanwendung erstellt hast, bist du sicherlich auf die einfache, aber tückische Aufgabe gestoßen: Wie liest man eine Textdatei, die im Ordner resources liegt? Es scheint doch nichts Kompliziertes zu sein, oder? Aber wenn man auf Stack Overflow schaut, erhält die Frage "How to read a text file from resources in Kotlin?" tausende von Aufrufen. Das zeigt, dass das Problem real ist.
In diesem Artikel werden wir 5 zuverlässige Methoden dafür durchgehen. Du wirst lernen, worin der Unterschied zwischen javaClass und ClassLoader besteht, wie du einen NullPointerException vermeidest und was zu tun ist, wenn dein Projekt eine Bibliothek und keine Anwendung ist. Los geht's!
1. Vorbereitung: Wohin mit der Datei?
\nBevor du liest, musst du die Datei an den richtigen Ort legen. In einem Standard-Kotlin-Projekt (Gradle, Maven) befindet sich der Ordner für Ressourcen normalerweise hier:
\n\nsrc/main/resources/\n\nFür Tests — src/test/resources/. Wenn du ein Android-Projekt hast, legt man Ressourcen in src/main/res/raw/ (dort gilt jedoch eine eigene Logik, dazu später mehr). Wir konzentrieren uns auf reines Kotlin/JVM.
Erstellen wir eine einfache Datei data.txt mit folgendem Inhalt:
Hallo, Welt!\nDas sind Zeilen aus Ressourcen.\nKotlin rockt.\n\nSuper, das Werkzeug ist bereit. Jetzt schauen wir uns an, wie man sie öffnet.
\n\n2. Methode Nr. 1: Klassisch über javaClass
\nDie beliebteste und intuitivste Methode ist die Verwendung von javaClass (dies ist der Kotlin-Wrapper für getClass() in Java).
import java.io.File\n\nfun readFromResources(fileName: String): String {\n val inputStream = this::class.java.classLoader?.getResourceAsStream(fileName)\n ?: throw IllegalArgumentException("Datei $fileName nicht in Ressourcen gefunden")\n return inputStream.bufferedReader().readText()\n}\n\nAnalyse:
\n- \n
this::class.java— ruft die Java-Klasse des aktuellen Objekts ab. \n .classLoader— holt den ClassLoader (Klassenlader). \n getResourceAsStream(fileName)— öffnet einen Stream. \n - Der Elvis-Operator
?:wirft eine Ausnahme, wenn die Datei nicht existiert. \n
Aufruf:
\nfun main() {\n val content = readFromResources("data.txt")\n println(content)\n}\n\nAls Ausgabe sehen wir die drei Zeilen unserer Datei. Einfach und elegant.
\n\n3. Methode Nr. 2: Verwendung eines object für Hilfsfunktionen
\nWenn du eine Hilfsklasse schreibst, ist es praktisch, die Logik in ein object (Singleton) auszulagern. In Kotlin geht das so:
object ResourceReader {\n fun readText(fileName: String): String {\n val stream = ResourceReader::class.java.classLoader\n .getResourceAsStream(fileName)\n ?: throw FileNotFoundException("Ressource $fileName nicht gefunden")\n return stream.bufferedReader().readText()\n }\n}\n\n// Verwendung:\nfun main() {\n val text = ResourceReader.readText("config.json")\n println(text)\n}\n\nBeachte: Wir verwenden ResourceReader::class.java — das funktioniert, weil object ein Singleton ist, das eine Klasse hat.
4. Methode Nr. 3: Lesen als URL (zum Abrufen des Pfads)
\nManchmal benötigt man nicht den Inhalt, sondern den Pfad zur Datei (z. B. zur Übergabe an eine andere Bibliothek). Dann verwenden wir getResource():
fun getResourcePath(fileName: String): String {\n val url = this::class.java.classLoader.getResource(fileName)\n ?: throw RuntimeException("Ressource $fileName nicht gefunden")\n return url.path\n}\n\nSei jedoch vorsichtig: Wenn das Projekt in einer JAR-Datei verpackt ist, kann url.path ins Innere des Archivs zeigen, und File kann sie nicht lesen. In diesem Fall ist es besser, immer einen Stream zu verwenden (