File.readLines în Kotlin

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

Citește un fișier text și returnează lista rândurilor, fără caracterele de rând nou.

Sintaxă
fun File.readLines(charset: Charset = Charsets.UTF_8): List<String>

Ce face File.readLines

File("elevi.txt").readLines() deschide fișierul, citește toate rândurile într-o List<String> și închide fișierul. Caracterele de sfârșit de rând (\n, \r\n) nu apar în elemente. Un rând nou la finalul fișierului nu produce un element gol în plus.

Rezultatul este o listă obișnuită, deci poți folosi direct filter, map, size sau destructurarea. Ca și readText, încarcă tot fișierul în memorie; pentru fișiere uriașe folosește useLines.

Parametri

Parametru Descriere
charset Codificarea; implicit UTF-8.

Ce returnează

O List<String> cu rândurile fișierului.

Exemple

Exemplul 1: Citirea unui fișier CSV

Primul rând este antetul; îl sărim cu drop(1) și împărțim restul după virgulă.

import java.io.File

fun main() {
    File("elevi.csv").writeText("nume,oras,media\nAna,Iași,9.50\nIon,Cluj,8.25\nMaria,Sibiu,9.80\n")
    val randuri = File("elevi.csv").readLines()
    println("Rânduri: ${randuri.size}")
    for (rand in randuri.drop(1)) {
        val (nume, oras, media) = rand.split(",")
        println("$nume ($oras): $media")
    }
}

Rezultat

Rânduri: 4
Ana (Iași): 9.50
Ion (Cluj): 8.25
Maria (Sibiu): 9.80

Exemplul 2: Statistici dintr-un fișier

Rândurile sunt o listă, așa că media se calculează cu map și average.

import java.io.File

fun main() {
    File("temperaturi.txt").writeText("12.5\n14.0\n9.5\n16.0\n")
    val valori = File("temperaturi.txt").readLines().map { it.toDouble() }
    println(valori)
    println("Media: ${valori.average()} °C, maxim: ${valori.max()} °C")
}

Rezultat

[12.5, 14.0, 9.5, 16.0]
Media: 13.0 °C, maxim: 16.0 °C

Exemplul 3: Ignorarea rândurilor goale și a comentariilor

Păstrăm doar rândurile care au conținut și nu încep cu #.

import java.io.File

fun main() {
    File("orase.txt").writeText("# lista oraselor\nIași\n\nCluj\n# temporar\nBrașov\n")
    val orase = File("orase.txt").readLines()
        .filter { it.isNotBlank() && !it.startsWith("#") }
    println(orase)
}

Rezultat

[Iași, Cluj, Brașov]

Greșeli frecvente

  • Folosești readText().split("\n"). Pe fișiere din Windows rămâne \r la final și apare un element gol după ultimul rând; readLines() le tratează corect.
  • Convertești toate rândurile cu toInt() fără să elimini rândurile goale, iar conversia eșuează.

Comenzi înrudite

  • File.readText: readText citește tot conținutul unui fișier ca String; writeText îl scrie (înlocuind tot), appendText adaugă la final.
  • 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.
  • String.lines: Împarte textul în rânduri, după orice tip de rând nou (\n, \r\n sau \r), și returnează lista lor.
  • String.split: Împarte un text în bucăți după un separator și returnează o listă de String-uri.