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ă
usesauclose()). 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șteFileWriter(fisier, true).buffered()sauappendText.
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.