Warum die Arbeit mit Dateien in Kotlin nicht weh tut
\n\nStellen Sie sich vor: Sie schreiben eine Anwendung, die Benutzereinstellungen speichern, Fehler protokollieren oder CSV-Dateien mit Tausenden von Zeilen verarbeiten soll. In Java sind dafür Dutzende Klassen wie BufferedReader, FileWriter und endlose try-catch-Blöcke zuständig. Und in Kotlin? Die von JetBrains entwickelte Sprache „vereinfacht“ Java nicht nur – sie denkt die Arbeit mit Daten neu. Hier werden Dateien mit einer einzigen Zeile geöffnet und Fehler elegant behandelt.
In diesem Artikel behandeln wir die Arbeit mit Dateien und dem Dateisystem in Kotlin von grundlegenden Operationen bis hin zu fortgeschrittenen Techniken. Sie erfahren, wie Sie Dateien lesen und schreiben, Verzeichnisse verwalten, mit JSON und CSV arbeiten und typische Fehler vermeiden. Bereit? Los geht's!
\n\nGrundlagen: Wie Kotlin Java IO vereinfacht
\n\nDas Hauptmerkmal von Kotlin sind Erweiterungsfunktionen. Anstatt Dutzende Zeilen zum Lesen einer Datei zu schreiben, verwenden Sie eine einzige Funktion wie .readText() oder .readLines(). Schauen wir uns konkrete Beispiele an.
Eine gesamte Datei lesen
\nDer einfachste Weg, eine Textdatei zu lesen, ist die Verwendung von readText(). Diese Methode gibt einen String mit dem Inhalt der Datei zurück. Wichtig: Die Datei wird nach dem Lesen automatisch geschlossen.
import java.io.File\n\nfun main() {\n val content = File("example.txt").readText()\n println(content)\n}\n\nWenn die Datei groß ist, ist es besser, zeilenweise zu lesen:
\n\nval lines = File("example.txt").readLines()\nlines.forEach { line -> println(line) }\n\nUnd wenn Sie als Stream lesen müssen (z. B. zur Verarbeitung großer Logs):
\n\nFile("example.txt").useLines { lines ->\n lines.forEach { line ->\n // Verarbeitung jeder Zeile\n println(line)\n }\n}\n\nBeachten Sie useLines() – dies ist eine Funktion, die das Schließen der Ressource nach Abschluss des Blocks garantiert. Es wirkt magisch, funktioniert aber wie try-with-resources in Java, nur kürzer.
In eine Datei schreiben
\nDas Schreiben von Daten in Kotlin ist ebenfalls intuitiv. Hier sind drei Varianten:
\n\n// 1. Datei überschreiben\nFile("output.txt").writeText("Hallo, Welt!")\n\n// 2. An das Ende der Datei anhängen\nFile("output.txt").appendText("Neue Zeile\\n")\n\n// 3. Eine Liste von Zeilen schreiben\nval list = listOf("Zeile1", "Zeile2", "Zeile3")\nFile("output.txt").writeText(list.joinToString("\\n"))\n\nÜbrigens: Wenn Sie mit Binärdaten (Bilder, Archive) arbeiten, verwenden Sie writeBytes() und readBytes():
val imageBytes = File("image.png").readBytes()\n// Byte-Verarbeitung...\nFile("copy.png").writeBytes(imageBytes)\n\nDateisystemverwaltung: Erstellen, Löschen, Verschieben
\n\nKotlin erfindet das Rad nicht neu, macht aber die Arbeit mit dem Dateisystem komfortabler. Alle Operationen sind über die Klasse java.io.File mit Erweiterungen verfügbar.
Verzeichnisse erstellen
\nUm ein Verzeichnis (und alle übergeordneten, falls nicht vorhanden) zu erstellen:
\n\nval dir = File("data/logs/2024")\nval created = dir.mkdirs() // Gibt true zurück, wenn erstellt\nprintln("Verzeichnis erstellt: $created")\n\nBeachten Sie: mkdir() erstellt nur den letzten Ordner, während mkdirs() die gesamte Kette erstellt.
Existenzprüfung und Löschen
\n\nval file = File("temp.txt")\nif (file.exists()) {\n if (file.delete()) {\n println("Datei gelöscht")\n } else {\n println("Löschen fehlgeschlagen")\n }\n}\n\n// Rekursives Löschen eines Verzeichnisses\nFile("data").deleteRecursively()\n\nSeien Sie vorsichtig mit deleteRecursively() – dies ist eine irreversible Operation. Überprüfen Sie zweimal, ob Sie die richtigen Daten löschen.
Verschieben und Kopieren
\n\nval source = File("old.txt")\nval target = File("new_dir/new.txt")\n\n// Verschieben (um