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.