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.