Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Leggere e scrivere un file binario

Capiamo come poter leggere e scrivere sequenze di byte che formano un file binario, come può essere, per esempio, un'immagine
Capiamo come poter leggere e scrivere sequenze di byte che formano un file binario, come può essere, per esempio, un'immagine
Link copiato negli appunti

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();
  }
}

Ti consigliamo anche