Abbiamo analizzato le classi messe a disposizione da Java per leggere e scrivere dei file di testo. Adesso vediamo come leggere e scrivere i file binari, cioè sequenze di byte, come può essere ad esempio un'immagine.
Le classi che Java mette a disposizione per leggere e scrivere file binari, sono rispettivamente java.io.FileInputStream
e java.io.FileOutputStream
.
- La classe FileInputStream è l'analogo della classe FileReader che viene utilizzata per leggere i dati da un file di testo.
- La classe FileOutputStream è l'analogo della classe FileWriter che viene utilizzata per scrivere i dati in un file di testo.
Per prendere confidenza con queste classi, analizziamo subito dei semplicissimi esempi.
Lettura di un file binario
public static void read(){
try {
FileInputStream fis = new FileInputStream(new File("C:prova.jpg"));
int c = fis.read();
while (c != -1){
c = fis.read();
..//
}
fis.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
Per ottenere un'istanza della classe FileInputStream, che ci permette di aprire un file binario in modalità lettura, possiamo utilizzare uno dei seguenti costruttori della classe:
FileInputStream(File file)
che riceve in ingresso un'istanza della classe File.FileInputStream(FileDescriptor fdObj)
che riceve in ingresso un'istanza della classe FileDescriptor.FileInputStream(String name)
che riceve in ingresso una stringa che rappresenta il path del file.
Tutti e tre i costruttori possono sollevare un'eccezione FileNotFoundException
qualora il file non viene trovato oppure non può essere aperto.
Per leggere un byte si utilizza il metodo read()
, che restituisce il byte sottoforma di numero intero compreso tra 0 e 255.
Il metodo read può sollevare un'eccezione, IOException, se per qualche motivo il byte corrente non può essere letto.
Esistono 3 versioni differenti del metodo read:
- int
read()
che permette di leggere un byte a partire dalla posizione corrente. - int
read(byte[] b)
che permette di leggere b.length byte dal file. I byte letti vengono memorizzati nel byte array b. - int
read(byte[] b, int off, int len)
che permette di leggere len byte dal file a partire dalla posizione off. I byte letti vengono memorizzati nel byte array b.
Quando la fine del file viene raggiunta (EOF End of file), il metodo read restituisce -1.
Al termine della lettura il file può essere chiuso invocando il metodo close()
.
Scrittura di un file binario
public static void write(){
try{
FileOutputStream fos = new FileOutputStream(new File("C:\test.jpg"));
int i = 1;
while (...){
..//
fos.write(1);
..//
}
fos.close();
}
catch (FileNotFoundException e){
e.printStackTrace();
}
catch (IOException e){
e.printStackTrace();
}
}
Per creare un'istanza della classe FileOutputStream, che ci permette di aprire un file binario in modalità scrittura, possiamo utilizzare uno dei seguenti costruttori della classe:
FileOutputStream(File file)
che riceve in ingresso un'istanza della classe File.FileOutputStream(File file, boolean append)
che riceve in ingresso un'istanza della classe File ed apre il file in modalità append.FileOutputStream(FileDescriptor fdObj)
che riceve in ingresso un'istanza della classe FileDescriptor.FileOutputStream(String name)
che riceve in ingresso una stringa che rappresenta il path del file.FileOutputStream(String name, boolean append)
che riceve in ingresso una stringa che rappresenta il path del file ed apre il file in modalità append.
Anche in questo caso può essere sollevata un'eccezione FileNotFoundException qualora il file non viene trovato oppure non può essere aperto in modalità scrittura.
Per scrivere un byte all'interno del file occorre invocare il metodo write(int c)
che riceve in ingresso un valore intero rappresentante il gruppo degli 8 bit meno significativi del byte.
Esistono 3 versioni differenti del metodo write:
void write(byte[] b)
che permette di scrivere b.length byte nel file.void write(byte[] b, int off, int len)
che permette di scrivere nel file len byte prelevati dal byte array b a partire dalla posizione off.void write(int b)
che permette di scrivere il byte b nel file.
Al termine delle operazioni di scrittura, il file deve essere chiuso invocando il metodo close()
, per assicurarsi che il contenuto dei buffer di sistema sia effettivamente trasferito sul file.
Copia di un file binario
In conclusione vediamo come copiare un file byte per byte.
public static void copy(){
try{
FileOutputStream fos = new FileOutputStream(new File("C:\out.jpg"));
FileInputStream fis = new FileInputStream(new File("C:\in.jpg"));
int c = fis.read();
while (c != -1){
c = fis.read();
fos.write(c);
}
fis.close();
fos.close();
}
catch (FileNotFoundException e){
e.printStackTrace();
}
catch (IOException e){
e.printStackTrace();
}
}