Il pacchetto java.io
definisce le operazioni di ingresso e uscita in termini di stream (flussi): sequenza ordinate di dati che hanno una sorgente (per gli stream di ingresso) o una destinazione (per gli stream di uscita).
Gli stream nascondono i dettagli del sistema operativo sottostante, rendendo (per quanto possibile) trasparente la gestione di file, ecc..
In genere, le operazioni sugli stream ricalcano i seguenti schemi:
Lettura:
creazione dello stream
while (ci sono informazioni da leggere)
leggi
chiusura dello stream
Scrittura:
creazione dello stream
while (ci sono informazioni da scrivere)
scrivi
chiusura dello stream
Gli stream forniti dal pacchetto java.io
sono di due tipi:
Flussi di byte (byte stream): gestiscono come unità di informazione i singoli byte (8 bit), quindi non fanno alcuna ipotesi sul tipo dei dati trattati, e, di conseguenza, sono “universali”: possono essere usati per qualsiasi tipo di informazione (immagini, audio, testo, ecc..)
Le classi che realizzano questi stream sono chiamate:
Flussi di caratteri (character stream): l’unità di informazione gestita sono caratteri Unicode a 16 bit. Essi permettono di effettuare l’I/O testuale in modo più conveniente, senza dover gestire manualmente la codifica dei caratteri, cosa che sarebbe invece necessaria lavorando direttamente con i flussi di byte.
Le classi corrispondenti sono indicate come:
In pratica, si usano gli stream di caratteri per i dati testuali, e i byte stream per tutti gli altri tipi di dati. Come caso particolare, i dati composti da caratteri rappresentati con un solo byte ciascuno ( ad esempio ASCII) possono essere facilmente gestiti con entrambi i tipi di stream.
Le operazioni di I/O possono sempre fallire (ad esempio, a casua di file non esistenti, permessi non adeguati, ecc..)
La maggior parte delle classi di java.io
segnalano gli errori lasciando un’eccezione di tipo IOException
(invece, in alcuni casi particolari, un errore viene segnalato cambiando lo stato dello stream).
Per leggere in formato binario, si utilizza un’istanza della classe FileInputStream
.
Per aprire un file, il cui nome deve essere conosciuto, si utilizza uno dei costruttori disponibili:
public FileInputStream(String name) throws FileNotFoundException;
Ad esempio:
FileInputStream in = new FileInputStream(fileName);
FileNotFoundException
, sollevata da questo costruttore quando il file non esiste, o non può essere letto per un qualsiasi altro motivo, è un’eccezione più specifica (sottoclasse) di IOException
(quindi è possibile, ma non necessario, gestirla correttamente).