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
  • La classe FileOutputStream

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)
  • FileInputStream(FileDescriptor fdObj)
  • FileInputStream(String name)

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()
  • int read(byte[] b)
  • int read(byte[] b, int off, int len)

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)
  • FileOutputStream(File file, boolean append)
  • FileOutputStream(FileDescriptor fdObj)
  • FileOutputStream(String name)
  • FileOutputStream(String name, boolean 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)
  • void write(byte[] b, int off, int len)
  • void write(int b)

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