Anche le operazioni sui file possono provocare situazioni inattese che il programma non sa gestire (ad esempio il tentativo di aprire in lettura un file inesistente). Tali situazioni si chiamano eccezioni. Le eccezioni sono classificate in base al tipo di inconveniente che si è verificato e devono essere gestite dal programmatore . I metodi che fanno uso di istruzioni che possono generare eccezioni devono dichiararlo. Ad esempio i metodi per l'apertura di un file in lettura possono generare una eccezione di tipo IOException. Tutti i metodi che invocano tali metodo devono quindi dichiarare esplicitamente che possono incorrere in una eccezione di quel tipo. La specifica del tipo di eccezione che un metodo può generare è fornita dalla clausola throws aggiunta alla dichiarazione del metodo. public static void main(String[] args) throws IOException Scrittura di file di testo Per scrivere stringhe di testo su un file occorre: 1. 2. 3. creare un oggetto della classe FileWriter associato al nome del file e un oggetto della classe PrintWriter associato all'oggetto FileWriter creato precedentemente scrivere testo sul file mediante i metodi print e println dell'oggetto PrintWriter chiudere il file Le istruzioni Java che realizzano le tre fasi descritte sopra sono: // 1. apertura del file in scrittura // creazione del file FileWriter f = new FileWriter("prova.txt"); PrintWriter out = new PrintWriter(f); // 2. scrittura di testo out.println("scrivo su file"); // 3. chiusura del file out.close(); L'invocazione del costruttore della classe FileWriter ha l'effetto di creare un file pronto per essere scritto. Se il file già esiste viene preliminarmente eliminato tutto il suo contenuto. Per aggiungere testo ad un file già esistente si dovrà usare il costruttore con la segnatura FileWriter(String, boolean) specificando il valore true come secondo argomento. Programma per la scrittura su file Il seguente programma crea un file di testo chiamato prova.txt e vi scrive la stringa "testo di prova". import java.io.*; public class ScritturaSuFile { public static void main(String[] args) throws IOException { // apertura del file per la scrittura FileWriter f = new FileWriter("prova.txt"); // creazione dell'oggetto per la scrittura PrintWriter out = new PrintWriter(f); // scrittura del testo su file out.println("testo di prova"); // chiusura del file out.close(); } } Nota: il programma deve gestire eventuali errori nell'accesso ai file dichiarando public static void main(Stringp[] args) throws IOException Le classi per la gestione dell'input/output sono racchiuse nel package java.io che è necessario quindi importare nelle classi che fanno uso di input/output. Lettura da file Per leggere stringhe di testo da un file occorre: 1. 2. 3. creare un oggetto della classe FileReader e un oggetto della classe BufferedReader associato all'oggetto FileReader creato precedentemente leggere le linee del file mediante il metodo readLine dell'oggetto BufferedReader. chiudere il file Le istruzioni Java che realizzano le tre fasi descritte sopra sono: // 1. apertura del file in lettura FileReader f = new FileReader("prova.txt");; BufferedReader in = BufferedReader(f); // 2. lettura di una riga del file String line = in.readLine(); // 3. chiusura del file f.close(); Se il file che si vuole aprire in lettura non esiste, all'atto della creazione dell'oggetto della classe FileReader viene generata una eccezione di tipo FileNotFoundException. Schema di ciclo di lettura da file La lettura di un insieme di stringhe da un file avviene mediante un ciclo così schematizzato: BufferedReader in = ... String linea = in.readLine(); while (linea!=null) { ... linea = in.readLine(); } Si noti che il metodo readLine restituisce il valore null se non ci sono dati da leggere (ad esempio alla fine del file). Questa condizione è usata per verificare la terminazione del ciclo. Esempio: lettura da file di un array di stringhe public static String[] loadArray(String nomefile, int n) throws IOException { // Creazione dell'array String[] v = new String[n]; // Ciclo di lettura delle stringhe nell'array FileReader f = new FileReader(nomefile); BufferedReader in = new BufferedReader(f); int i=0; String linea = in.readLine(); while ((linea!=null) && (i<n)) { v[i] = linea; linea = in.readLine(); i++; } f.close(); return v; } Questo metodo legge le prime n linee di un file e restituisce il corrispondente array di stringhe. Se il file contiene meno di n linee, le altri componenti dell'array restituito conterranno il valore null.