Sunteți pe pagina 1din 2

Disciplina: Metode avansate de programare

Cadru didactic: Ralf Fabian


Specializarea: Informatică, anul II.

Try with resource


De fiecare dată când se deschide o conexiune spre o sursă de date (fișier, bază de date, pagina web
etc.) sistemul de operare va alocă resurse. Odată ce s-a terminat utilizarea susei de date, resursele
alocate de sistem pot fi eliberate. Acest lucru se face prin apelarea metodei close indiferent că este
vorba de citire sau scriere de date.

Pe fluxuri de ieșire OutputStream apelarea explicită a metodei close implică și operația de flush.

În următorul exemplu de cod, se scrie un text într-un fișier text folosind un flux de tip FileWriter.

public class FileWriterTest {


public static void main(String[] args) {
FileWriter out = null;
try {

out = new FileWriter("test.txt");


out.write("Hello world!");

} catch (IOException ex) {


ex.printStackTrace();
} finally {

if (out != null) {
try {

out.close();

} catch (IOException ex) {


ex.printStackTrace();
}
}
}
}
}

Se poate observa că atât write cât și close pot arunca o excepție de tip IOException, așadar au
nevoie de câte un bloc try-catch separat, pentru a putea diferenția cele două situații. De asemenea,
obiectul out de tip FileWriter este în continuare accesibil în cod, chiar și după apelul close.
Introducerea lui out în primul try ar rezolva problema aceasta dar ar face în același timp și out
invizibil în finally. Pentru astfel de situații a fost introdus începând cu Java 1.7 instrucțiunea
„try-with-resources”.

Codul de mai sus poate fi rescris astfel:

public class TryWithResourceFileWriterTest {


public static void main(String[] args) {

try (FileWriter out = new FileWriter("test.txt")) {

1
out.write("Hello world!!");
} catch (IOException ex) {
ex.printStackTrace();
}
// No close statements required
// "out" not accessible here
}
}

În acest mod codul devine mai scurt, obiectul out este vizibil doar în interiorul blocului try iar close
este apelat automat.

Interfața AutoCloseable este introdusă cu Java 1.7 și conține doar metoda close() a cărui scop este
de a închide o resursă în momentul în carea aceasta nu mai este necesară. Majoritatea claselor care
lucrează cu surse de date ce necesită o închidere după terminarea utilizări, implementează interfața
java.lang.AutoCloseable (de exemplu, toate fluxurile de date).

Metoda close este apelată automate pe obiecte gestionate prin instrucțiunea try-with-resource. Cu
alte cuvinte, în cadrul instrucțiuni try-with-resource se poate crea un obiect ce implementează
interfața java.lang.AutoCloseable.

Dacă se creează mai multe resurse în try-with-resource, atunci acestea trebuie se fie separate prin
punt și virgulă.

public class TryWithMultiResourceFileWriterTest {


public static void main(String[] args) {

try (FileWriter fw = new FileWriter("test.txt");


BufferedWriter out = new BufferedWriter(fw);) {
out.write("Hello world!!");
} catch (IOException ex) {
ex.printStackTrace();
}
// No close statements required
// "out" not accessible here
}
}