Middle
Wie arbeitet man mit Dateien und Ein- / Ausgabeströmen (I/O) in Kotlin?
sobes.tech KI
Antwort von AI
Die Standardbibliothek von Kotlin bietet praktische Erweiterungen für die Arbeit mit I/O, die die Interaktion mit java.io vereinfachen.
Hauptansätze und Klassen:
-
Datei lesen:
File.readBytes(): Liest den Inhalt der Datei in ein Byte-Array.File.readText(): Liest den Inhalt der Datei als String (unter Berücksichtigung der Kodierung).File.forEachLine { ... }: Verarbeitet jede Zeile der Datei.File.bufferedReader(): Erstellt einenBufferedReaderfür zeilenweises Lesen.File.inputStream(): Erstellt einenInputStreamzum Lesen von Bytes.
-
In Datei schreiben:
File.writeBytes(bytes): Schreibt ein Byte-Array in eine Datei.File.writeText(text, append): Schreibt einen String in eine Datei.append = truezum Anhängen.File.printWriter(): Erstellt einenPrintWriterfür formatiertes Schreiben.File.outputStream(): Erstellt einenOutputStreamzum Schreiben von Bytes.
-
Arbeiten mit Streams:
InputStream.bufferedReader(): Wickelt einenInputStreamin einenBufferedReader.OutputStream.printWriter(): Wickelt einenOutputStreamin einenPrintWriter.- Erweiterungsfunktionen
copyTo(outputStream)zum Kopieren von Inhalten zwischen Streams.
-
Ressourcenverwaltung (Closures):
- Erweiterungsfunktionen
use { ... }zum automatischen Schließen von Streams und Lesern/Schreibern, auch bei Ausnahmen.
- Erweiterungsfunktionen
import java.io.File
fun main() {
val file = File("my_file.txt")
// In Datei schreiben
file.writeText("Hallo, Kotlin I/O!")
file.appendText("\nFortsetzung der Zeile.")
// Zeile für Zeile lesen
file.forEachLine { line ->
println(line)
}
// Gesamten Inhalt als Text lesen
val content = file.readText()
println("\nGesamtinhalt der Datei:")
println(content)
// BufferedReader mit use verwenden
file.bufferedReader().use { reader ->
reader.lines().forEach(::println) // Lesen mit Java Stream API
}
// Datei kopieren
val newFile = File("my_file_copy.txt")
file.inputStream().use { input ->
newFile.outputStream().use { output ->
input.copyTo(output) // Bequemer Kopiervorgang
}
}
}
Vergleichstabelle einiger Methoden:
| Methode | Zweck | Datentyp | Zeile für Zeile / Ganz | Anmerkung |
|---|---|---|---|---|
readBytes() |
Lesen in Bytes | ByteArray |
Ganz | Für Binärdaten geeignet |
readText() |
Als Text lesen | String |
Ganz | Für Textdateien praktisch |
forEachLine { } |
Verarbeitung jeder Zeile | String |
Zeile für Zeile | Ideal für große Textdateien |
bufferedReader() |
Erstellen eines gepufferten Lesers | N/A | Stream | Flexible Kontrolle, erfordert use |
writeBytes() |
Bytes schreiben | ByteArray |
Ganz | Für Binärdaten geeignet |
writeText() |
Text schreiben | String |
Ganz/Anhängen | Für Textdateien praktisch |
printWriter() |
Erstellen eines formatierten Schreibers | N/A | Stream | Für formatierten Output nützlich, erfordert use |
Die Verwendung von use { ... } ist entscheidend für die sichere Arbeit mit I/O in Kotlin, um Ressourcen freizugeben. Kotlin erweitert die bestehenden Java-Klassen (File, InputStream, OutputStream usw.) um nützliche Funktionen.