tryWithResources

chiudere automaticamente i file

Durante l'interazione con il filesystem molte cose possono andare storte e per questo motivo le parti di programma che gestiscono la lettura o la scrittura dei dati si trovano all'inerno di blocchi try-catch come quello qui sotto

try {
    FileReader flussoCaratteri = new FileReader("/Volumes/ramdisk/k.txt");
    BufferedReader lettoreDiRighe = new BufferedReader(flussoCaratteri);
    String testo = lettoreDiRighe.readLine();
    System.out.println(testo);
    lettoreDiRighe.close();
    flussoCaratteri.close();
} catch (FileNotFoundException e) {
    System.out.println("Non trovo il file");
} catch (IOException e) {
    System.out.println("Problemi durante la lettura");
}

Questo è uno schema piuttosto usuale: creo gli oggetti che fanno I/O, leggo (o scrivo) e poi chiudo, il tutto racchiuso in un blocco try-catch per intercettare eventuali eccezioni. È talmente usuale che possiamo usare una scorciatoia chiamata try with resources che ci consente di evitare di scrivere (o di dimenticare!) il close: all'uscita del try le risorse aperte nel try stesso verranno chiuse in automatico da java in ogni caso (che siano state sollevate eccezioni o meno).

try(
    FileReader flussoCaratteri = new FileReader("/Volumes/ramdisk/k.txt");
    BufferedReader lettoreDiRighe = new BufferedReader(flussoCaratteri);
){
    String testo = lettoreDiRighe.readLine();
    System.out.println(testo);
} catch (FileNotFoundException e) {
    System.out.println("Non trovo il file");
} catch (IOException e) {
    System.out.println("Problemi durante la lettura");
}

Come si vede le due righe che contenevano i close() sono sparite e prima della graffa di apertura del try sono state inserite due dichiarazioni e creazioni di oggetti che poi andranno chiusi. Da notare che dentro le parentesi tonde non possono essere dichiarate e create variabili qualsiasi ma soltanto oggetti che possono essere chiusi in automatico.