File.bufferedReader în Kotlin

Fișiere (kotlin.io) Kotlin 1.0 (JVM)

Deschide un fișier pentru citire sau scriere cu buffer; se folosește cu use, ca să fie închis automat.

Sintaxă
fun File.bufferedReader(charset: Charset = Charsets.UTF_8, bufferSize: Int = DEFAULT_BUFFER_SIZE): BufferedReader
fun File.bufferedWriter(charset: Charset = Charsets.UTF_8, bufferSize: Int = DEFAULT_BUFFER_SIZE): BufferedWriter

Ce face File.bufferedReader

bufferedWriter() deschide fișierul pentru scriere (îl golește dacă exista) și returnează un BufferedWriter. Textul se adună întâi în memorie și se scrie pe disc în blocuri mari, deci scrierea a mii de rânduri este rapidă. bufferedReader() face același lucru pentru citire, cu metode ca readLine(), readText() sau lineSequence().

Spre deosebire de writeText, aceste obiecte rămân deschise până le închizi. Folosește-le mereu cu use { }: fișierul se închide (și datele din buffer se scriu) la ieșirea din bloc, chiar dacă apare o excepție.

Parametri

Parametru Descriere
charset Codificarea; implicit UTF-8.
bufferSize Mărimea buffer-ului în caractere; valoarea implicită este potrivită aproape mereu.

Ce returnează

Un BufferedReader sau un BufferedWriter.

Exemple

Exemplul 1: Scrierea unui raport cu bufferedWriter

use închide fișierul la final; abia atunci tot textul ajunge sigur pe disc.

import java.io.File

fun main() {
    val vanzari = mapOf("Iași" to 1250, "Cluj" to 980, "Timișoara" to 1430)
    File("raport.txt").bufferedWriter().use { out ->
        out.write("Raport vânzări")
        out.newLine()
        for ((oras, suma) in vanzari) {
            out.write("$oras: $suma lei")
            out.newLine()
        }
    }
    print(File("raport.txt").readText())
}

Rezultat

Raport vânzări
Iași: 1250 lei
Cluj: 980 lei
Timișoara: 1430 lei

Exemplul 2: Citire rând cu rând cu readLine

readLine() returnează null la sfârșitul fișierului, ceea ce oprește bucla.

import java.io.File

fun main() {
    File("cumparaturi.txt").writeText("pâine\nlapte\nouă\n")
    File("cumparaturi.txt").bufferedReader().use { input ->
        var rand = input.readLine()
        while (rand != null) {
            println("- $rand")
            rand = input.readLine()
        }
    }
}

Rezultat

- pâine
- lapte
- ouă

Exemplul 3: lineSequence și appendLine

Un writer acceptă și appendLine. La citire, lineSequence() dă rândurile ca secvență.

import java.io.File

fun main() {
    File("numere.txt").bufferedWriter().use { out ->
        for (i in 1..5) out.appendLine((i * 10).toString())
    }
    val suma = File("numere.txt").bufferedReader().use { input ->
        input.lineSequence().sumOf { it.toInt() }
    }
    println("Suma: $suma")
}

Rezultat

Suma: 150

Greșeli frecvente

  • Uiți să închizi writer-ul (fără use sau close()). Ultimele date rămân în buffer și fișierul iese incomplet sau gol.
  • Folosești bufferedWriter() crezând că adaugă la final. Fișierul este golit; pentru adăugare folosește FileWriter(fisier, true).buffered() sau appendText.

Comenzi înrudite

  • use: Folosește o resursă (fișier, conexiune) într-un bloc și o închide automat la final, chiar dacă apare o excepție.
  • File.forEachLine: Parcurg un fișier rând cu rând, fără să-l încarce tot în memorie; fișierul se închide automat la final.
  • File.readText: readText citește tot conținutul unui fișier ca String; writeText îl scrie (înlocuind tot), appendText adaugă la final.