MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Închiderea fluxurilor

La finalizarea lucrului cu un flux, acesta trebuie închis cu ajutorul metodei close(), care este definită în interfața Closeable. Metoda close are următoarea definiție:

void close() throws IOException

Această interfață este deja implementată în clasele InputStream și OutputStream, iar prin intermediul acestora și în toate clasele de fluxuri.

La închiderea fluxului, toate resursele alocate acestuia, de exemplu fișierul, sunt eliberate. Dacă fluxul nu este închis, poate apărea o scurgere de memorie.

Există două modalități de închidere a fișierului. Prima, cea tradițională, constă în utilizarea blocului try..catch..finally. De exemplu, să citim datele dintr-un fișier:

import java.io.*;

public class Program {

   public static void main(String[] args) {

       FileInputStream fin = null;
       try {
           fin = new FileInputStream("C://SomeDir//notes.txt");

           int i = -1;
           while ((i = fin.read()) != -1) {

               System.out.print((char) i);
           }
       } catch (IOException ex) {

           System.out.println(ex.getMessage());
       } finally {

           try {

               if (fin != null)
                   fin.close();
           } catch (IOException ex) {

               System.out.println(ex.getMessage());
           }
       }
   }
}

Deoarece la deschiderea sau citirea fișierului poate apărea o eroare de intrare-ieșire, codul de citire este plasat într-un bloc try. Și pentru a fi siguri că fluxul va fi închis în orice situație, chiar și dacă apare o eroare în timpul utilizării acestuia, apelul metodei close() este plasat în blocul finally.

Deoarece metoda close() poate genera, de asemenea, o excepție IOException în cazul unei erori, apelul său este încapsulat într-un bloc try..catch intern.

Începând cu Java 7, putem utiliza o altă metodă care apelează automat metoda close. Această metodă constă în utilizarea construcției try-with-resources (try-cu-resurse).

Această construcție funcționează cu obiecte care implementează interfața AutoCloseable. Deoarece toate clasele de fluxuri implementează interfața Closeable, care la rândul său moștenește de la AutoCloseable, acestea pot fi utilizate în această construcție.

Așadar, să rescriem exemplul anterior folosind construcția try-with-resources:

import java.io.*;

public class Program {

   public static void main(String[] args) {

       try (FileInputStream fin = new FileInputStream("C://SomeDir//notes.txt")) {

           int i = -1;
           while ((i = fin.read()) != -1) {

               System.out.print((char) i);
           }
       } catch (IOException ex) {

           System.out.println(ex.getMessage());
       }
   }
}

Sintaxa acestei construcții este următoarea: try(numele_clasei numele_variabilei = constructorul_clasei). Această construcție nu exclude, de asemenea, utilizarea blocurilor catch.

După finalizarea lucrului în blocul try, metoda close() este apelată automat pe resursa utilizată (în acest caz, pe obiectul FileInputStream).

Dacă trebuie să utilizăm mai multe fluxuri care trebuie închise după execuție, putem specifica obiectele fluxurilor separate prin punct și virgulă:


try (FileInputStream fin = new FileInputStream("C://SomeDir//Hello.txt");
    FileOutputStream fos = new FileOutputStream("C://SomeDir//Hello2.txt")) {
   //..................
}
← Lecția anterioară Lecția următoare →