Sobes.tech
Middle

Hoe werk je met bestanden en invoer-/uitvoerstromen (I/O) in Kotlin?

sobes.tech AI

Antwoord van AI

De standaardbibliotheek van Kotlin biedt handige uitbreidingen voor werken met I/O, waardoor de interactie met java.io wordt vereenvoudigd.

Belangrijkste benaderingen en klassen:

  • Lezen uit een bestand:

    • File.readBytes(): Leest de inhoud van het bestand in een byte-array.
    • File.readText(): Leest de inhoud van het bestand als een string (met encoding).
    • File.forEachLine { ... }: Verwerkt elke regel van het bestand.
    • File.bufferedReader(): Maakt een BufferedReader voor regelgebaseerd lezen.
    • File.inputStream(): Maakt een InputStream voor het lezen van bytes.
  • Schrijven naar een bestand:

    • File.writeBytes(bytes): Schrijft een byte-array naar een bestand.
    • File.writeText(text, append): Schrijft een string naar een bestand. append = true voor toevoegen.
    • File.printWriter(): Maakt een PrintWriter voor geformatteerd tekstschrijven.
    • File.outputStream(): Maakt een OutputStream voor het schrijven van bytes.
  • Werken met streams:

    • InputStream.bufferedReader(): Wikkelt een InputStream in een BufferedReader.
    • OutputStream.printWriter(): Wikkelt een OutputStream in een PrintWriter.
    • Extensiefuncties copyTo(outputStream) voor het kopiëren van inhoud tussen streams.
  • Resourcebeheer (closures):

    • Extensiefuncties use { ... } voor automatische sluiting van streams en lezers/schrijvers, zelfs bij uitzonderingen.
import java.io.File

fun main() {
    val file = File("my_file.txt")

    // Schrijven naar bestand
    file.writeText("Hallo, Kotlin I/O!")
    file.appendText("\nVervolg van de regel.")

    // Regel-voor-regel lezen
    file.forEachLine { line ->
        println(line)
    }

    // Alles lezen als tekst
    val content = file.readText()
    println("\nVolledige inhoud van het bestand:")
    println(content)

    // Gebruik maken van bufferedReader met use
    file.bufferedReader().use { reader ->
        reader.lines().forEach(::println) // Lezen via Java Stream API
    }

    // Bestand kopiëren
    val newFile = File("my_file_copy.txt")
    file.inputStream().use { input ->
        newFile.outputStream().use { output ->
            input.copyTo(output) // Handige kopie van streams
        }
    }
}

Vergelijkingstabel van enkele methoden:

Methode Doel Gegevenstype Regel voor regel / Alles Opmerking
readBytes() Lezen in bytes ByteArray Alles Geschikt voor binaire gegevens
readText() Lezen als tekst String Alles Handig voor tekstbestanden
forEachLine { } Verwerken van elke regel String Regel voor regel Ideaal voor grote tekstbestanden
bufferedReader() Buffer-geleide lezer maken N/A Stream Flexibele controle, vereist use
writeBytes() Bytes schrijven ByteArray Alles Geschikt voor binaire gegevens
writeText() Tekst schrijven String Alles / toevoegen Handig voor tekstbestanden
printWriter() Geformatteerde schrijver maken N/A Stream Handig voor geformatteerde uitvoer, vereist use

Het gebruik van use { ... } is essentieel voor veilig werken met I/O in Kotlin, omdat het resources vrijmaakt. Kotlin breidt bestaande Java-klassen (File, InputStream, OutputStream, enz.) uit met nuttige functies.