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.