Sobes.tech
Middle

Cum să lucrezi cu fișiere și fluxuri de intrare/ieșire (I/O) în Kotlin?

sobes.tech AI

Răspuns de la AI

Biblioteca standard Kotlin oferă extensii convenabile pentru lucru cu I/O, simplificând interacțiunea cu java.io.

Abordări principale și clase:

  • Citirea din fișier:

    • File.readBytes(): Citește conținutul fișierului într-un array de bytes.
    • File.readText(): Citește conținutul fișierului ca șir de caractere (luând în considerare codificarea).
    • File.forEachLine { ... }: Procesează fiecare linie a fișierului.
    • File.bufferedReader(): Creează un BufferedReader pentru citire linie cu linie.
    • File.inputStream(): Creează un InputStream pentru citirea de bytes.
  • Scriere în fișier:

    • File.writeBytes(bytes): Scrie un array de bytes în fișier.
    • File.writeText(text, append): Scrie un șir de caractere în fișier. append = true pentru adăugare.
    • File.printWriter(): Creează un PrintWriter pentru scriere formatată.
    • File.outputStream(): Creează un OutputStream pentru scriere de bytes.
  • Lucru cu fluxuri:

    • InputStream.bufferedReader(): Învelește un InputStream într-un BufferedReader.
    • OutputStream.printWriter(): Învelește un OutputStream într-un PrintWriter.
    • Funcții de extensie copyTo(outputStream) pentru copierea conținutului între fluxuri.
  • Gestionarea resurselor (closures):

    • Funcții de extensie use { ... } pentru închiderea automată a fluxurilor și cititorilor/scrierilor, chiar și în caz de excepții.
import java.io.File

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

    // Scriere în fișier
    file.writeText("Salut, Kotlin I/O!")
    file.appendText("\nContinuarea liniei.")

    // Citire linie cu linie
    file.forEachLine { line ->
        println(line)
    }

    // Citire întreg conținut ca text
    val content = file.readText()
    println("\nConținutul complet al fișierului:")
    println(content)

    // Utilizare bufferedReader cu use
    file.bufferedReader().use { reader ->
        reader.lines().forEach(::println) // Citire prin API-ul Stream de Java
    }

    // Copiere fișier
    val newFile = File("my_file_copy.txt")
    file.inputStream().use { input ->
        newFile.outputStream().use { output ->
            input.copyTo(output) // Copiere convenabilă a fluxurilor
        }
    }
}

Tabel comparativ pentru unele metode:

Metodă Scop Tip de date Linie pentru linie / Întreg Notă
readBytes() Citire în bytes ByteArray Întreg Potrivit pentru date binare
readText() Citire ca text String Întreg Convenabil pentru fișiere text
forEachLine { } Procesare fiecare linie String Linie pentru linie Ideal pentru fișiere text mari
bufferedReader() Creare cititor bufferizat N/A Flux Control flexibil, necesită use
writeBytes() Scriere bytes ByteArray Întreg Potrivit pentru date binare
writeText() Scriere text String Întreg / adăugare Convenabil pentru fișiere text
printWriter() Creare scriitor formatat N/A Flux Util pentru ieșire formatată, necesită use

Utilizarea use { ... } este esențială pentru lucrul sigur cu I/O în Kotlin, garantând eliberarea resurselor. Kotlin extinde clasele Java existente (File, InputStream, OutputStream etc.) cu funcții utile.