Ce face use
Resursele precum fișierele deschise, conexiunile la baze de date sau socket-urile trebuie închise cu close() după folosire. resursa.use { ... } rulează blocul cu resursa ca it și apoi apelează close() întotdeauna: și când blocul se termină normal, și când aruncă o excepție.
Este echivalentul Kotlin al lui try-with-resources din Java. Funcționează cu orice obiect Closeable sau AutoCloseable. Rezultatul lui use este rezultatul blocului, deci poți citi direct o valoare: File("a.txt").bufferedReader().use { it.readLine() }.
Parametri
| Parametru | Descriere |
|---|---|
block: (T) -> R |
Codul care folosește resursa; primește resursa ca it. |
Ce returnează
Rezultatul blocului. Resursa este închisă înainte ca valoarea să fie returnată.
Exemple
Exemplul 1: Scriere și citire de fișier cu use
Ambele fluxuri sunt închise automat la ieșirea din bloc; nu trebuie apelat close().
import java.io.File
fun main() {
val fisier = File("note.txt")
fisier.bufferedWriter().use { w ->
w.write("Ana 9\n")
w.write("Ion 7\n")
}
val primulRand = fisier.bufferedReader().use { it.readLine() }
println("Primul rând: $primulRand")
println("Tot fișierul:\n${fisier.readText()}")
}
Rezultat
Primul rând: Ana 9
Tot fișierul:
Ana 9
Ion 7
Exemplul 2: close() se apelează și la excepție
O resursă proprie, care afișează când este închisă. În al doilea bloc apare o eroare, dar „închid” este afișat înaintea mesajului erorii.
class Conexiune(private val nume: String) : AutoCloseable {
fun trimite(mesaj: String) = println("[$nume] trimit: $mesaj")
override fun close() = println("[$nume] închid conexiunea")
}
fun main() {
Conexiune("server-iasi").use { it.trimite("salut") }
try {
Conexiune("server-cluj").use {
it.trimite("comanda 1")
error("conexiune pierdută")
}
} catch (e: IllegalStateException) {
println("Eroare: ${e.message}")
}
}
Rezultat
[server-iasi] trimit: salut
[server-iasi] închid conexiunea
[server-cluj] trimit: comanda 1
[server-cluj] închid conexiunea
Eroare: conexiune pierdută
Greșeli frecvente
- Deschizi fișiere cu
bufferedReader()fără use și uiți de close(). Pe Windows fișierul rămâne blocat, iar programul poate rămâne fără descriptori de fișier. - Returnezi resursa din bloc și o folosești după
use. După bloc este deja închisă; citește tot ce îți trebuie în interior.
Comenzi înrudite
File.bufferedReader: Deschide un fișier pentru citire sau scriere cu buffer; se folosește cu use, ca să fie închis automat.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.runCatching: Rulează un bloc și prinde orice excepție într-un Result; valoarea se scoate cu getOrNull, getOrElse sau getOrThrow.