File in Java e Serializzazione

Java fornisce una serie di classi apposite per le operazioni su File, vediamo come usarle.

File di testo

Per operazioni su file di testo Java mette a disposizione le classi FileWriter e FileReader, da usare assieme alla classe File.

Qui sotto trovi il codice per lettura e scrittura su file di testo.

Creazione e scrittura su File di testo

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Main {

    public static void main(String[] args) { 

        try{

            //Creo un file
            File file = new File("prova.txt");

            //creo uno stream per scrivere su file
            FileWriter writer = new FileWriter(file);

            //scrivo su file
            writer.write("Sto scrivendo un file di testo!");

            //chiudo lo stream
            writer.close();

            System.out.println("Scrittura completata!");
        }
        catch(IOException e){
            System.out.println("Errore durante la scrittura: "+ e);
        }
        
    }
}

Append su File di testo

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Main {

    public static void main(String[] args) { 

        try{

            //Apro un file
            File file = new File("prova.txt", true);

            //creo uno stream per scrivere su file, il secondo parametro (true) indica la modalità append
            FileWriter writer = new FileWriter(file, true);

            //scrivo su file
            writer.write("Sto facendo l'append su un file di testo!");

            //chiudo lo stream
            writer.close();

            System.out.println("Scrittura completata!");
        }
        catch(IOException e){
            System.out.println("Errore durante la scrittura: "+ e);
        }
        
    }
}

Lettura di un File di testo

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class Main {

    public static void main(String[] args) { 

        try{

            //Apro il file
            File file = new File("prova.txt");

            //creo uno stream per leggere da file
            FileReader reader = new FileReader(file);

            //questo mi permette di leggere linee intere
            BufferedReader lineReader = new BufferedReader(reader);

            System.out.println("Contenuto: ");
            
            //Leggo una linea alla volta e la stampo finchè non arrivo alla fine del file
            String linea = lineReader.readLine();

            while(linea != null) {

                System.out.println(linea);
                linea = lineReader.readLine();
            }

            //chiudo lo stream
            lineReader.close();
            reader.close();

            System.out.println("Lettura completata!");
        }
        catch(IOException e){
            System.out.println("Errore durante la lettura: "+ e);
        }
        
    }
}

Eliminazione di un file

import java.io.File;

public class Main {

    public static void main(String[] args) { 

        //Apro un file
        File file = new File("prova.txt");

        //provo ad eliminare il file
        if(file.delete()){
            System.out.println("Eliminazione completata!");
        }
        else{
            System.out.println("Eliminazione fallita");
        }

    }
}

File Binari

Java, rispetto a C, introduce un nuovo modo di scrivere dati su file: la serializzazione, che permette di leggere e scrivere oggetti trasformandoli in byte. I file di oggetti serializzati sono indipendenti dalla piattaforma, e possono quindi essere trasferiti su computer con architetture diverse.

Per essere serializzato correttamente, un oggetto deve implementare l'interfaccia Serializable.

Vediamo un esempio:

import java.io.Serializable;

public class Alunno implements Serializable {

    private String nome;
    private String cognome;
    private double media;

    public Alunno() {}

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCognome() {
        return cognome;
    }

    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    public double getMedia() {
        return media;
    }

    public void setMedia(double media) {
        this.media = media;
    }
}

Per leggere e scrivere su file useremo rispettivamente ObjectInputStream e ObjectOutputStream.

Qui sotto trovi il codice per lettura e scrittura di file binari.

Creazione e scrittura su File binario

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Main {

    public static void main(String[] args) { 

        Alunno a = new Alunno("Mario","Rossi", 9);

        try{

            //Creo un file
            File file = new File("prova.dat");

            //creo uno stream per scrivere su file binario
            FileOutputStream fileOut = new FileOutputStream(file);

            //creo uno stream per scrivere oggetti
            ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);

            //scrivo su file un oggetto
            objectOut.writeObject(a);

            //chiudo lo stream
            objectOut.close();
            fileOut.close();

            System.out.println("Scrittura completata!");
        }
        catch(IOException e){
            System.out.println("Errore durante la scrittura: "+ e);
        }
        
    }
}

Lettura di un File binario

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Main {

    public static void main(String[] args) { 

        try{

            //Apro un file
            File file = new File("prova.dat");

            //creo uno stream per leggere su file binario
            FileInputStream fileIn = new FileInputStream(file);

            //creo uno stream per leggere oggetti
            ObjectInputStream objectIn = new ObjectInputStream(fileIn);

            //leggo un oggetto da file
            Alunno a = (Alunno) objectIn.readObject();
            System.out.println(a.getNome() + " " + a.getCognome() + " " + a.getMedia());
               
            //chiudo lo stream
            objectIn.close();
            fileIn.close();

            System.out.println("Lettura completata!");
        }
        catch(IOException e){
            System.out.println("Errore durante la Lettura: "+ e);
        }
        catch(ClassNotFoundException e){
            System.out.println("Errore durante la Lettura: "+ e);
        }
        
    }
}
© Nicola Bovolato 2020