LA GESTIONE DEI FILE IN JAVA

java-logoPer lavorare con i file Java mette a disposizione diverse classi che consentono di:

  • creare file e directory
  • cercare file e directory
  • rinominare file e directory
  • cancellare file e directory
  • scrivere all’interno di un file
  • leggere il testo contenuto in un file

Le classi principali si trovano nel package java.io (io sta per InputOutput …) e sono:

  • per la gestione:
    • java.io.File
  • per la scrittura:
    • java.io.FileWriter
    • java.io.BufferedWriter
    • java.io.PrintWriter
  • per la lettura:
    • java.io.FileReader
    • java.io.BufferedReader
  • File: è una rappresentazione di un file o di una directory. Questa classe permette di creare, eliminare, rinominare e cercare un file, una directory (o sottodirectory)
  • FileWriter: consente di scrivere in un file di testo un carattere per volta
  • BufferedWriter: è simile alla classe FileWriter ma consente di scrivere i caratteri nel file in blocchi, memorizzati in un buffer temporaneo. I caratteri vengono letti dal buffer e scritti sul file. Questa classe ha delle performance migliori della classe FileWriter
  • PrintWriter: è simile alla classe BufferedWriter ma consente di scrivere nel file testo formattato
  • FileReader: consente di leggere i caratteri contenuti in un file di testo, leggendoli uno per volta
  • BufferedReader: è simile alla classe FileReader ma consente di leggere i caratteri presenti nel file in blocchi, memorizzati in un buffer temporaneo. Quando i caratteri vengono richiesti, vengono letti dal buffer. Questa classe ha delle performance migliori della classe FileReader

LA CLASSE FILE

ll costruttore principale della classe File riceve in ingresso una variabile di tipo String che contiene il Path del file (cioè il percorso dove salvarlo ed il nome del file o della directory).

Esempi di Path:

  • “C:/corsi/java/lezioneX/”
  • “C:/corsi/java/lezioneX/file1.txt”

La creazione dell’istanza della classe File non genera la creazione fisica del file o della directory sul disco fisso.

  • Per creare file fisicamente è necessario chiamare il metodo createNewFile()
  • Per creare directory fisicamente è necessario chiamare il metodo mkdir()

I metodi principali della classe File sono:

  • exists(): restituisce true se il file o la directory esiste, false altrimenti
  • createNewFile(): crea un file sul disco nel Path specificato
  • delete(): elimina il file o la directory dal disco
  • isFile(): restituisce true se la risorsa è un file, false altrimenti
  • isDir(): restituisce true se la risorsa è una directory, false altrimenti
  • mkDir(): crea una directory sul disco nel Path specificato
java-io
package it.corso.java.gestionefile;

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

public class TestFileClass {

    public static void create()throws IOException{
        //CREO IL PATH PER LA LA DIRECTORY
        File f1 = new File(new File(".").getCanonicalPath() + File.separator + "test-dir");
        String dir = f1.getPath();
        //PATH DEL FILE
        String file = dir + File.separator + "test-file.txt";
        //CREO LA DIRECTORY
        creaDirectory(dir);
        //CREO IL FILE
        creaFile(file);
        //CREO I FILE PER LA LETTURA/SCRITTURA
        String file1 = dir + File.separator + "buffered-writer.txt";
        creaFile(file1);
        String file2_1 = dir + File.separator + "file-writer.txt";
        creaFile(file2_1);
        String file3 = dir + File.separator + "lettura.txt";
        creaFile(file3);
        File d = new File(dir);
        System.out.println(d.isDirectory());
        File f = new File(file);
        System.out.println(f.isFile());
        File[] files = d.listFiles();
        for (File file2 : files) {
            System.out.println(file2.getName());
        }
    }
    public static void creaFile(String path) {
        File f = new File(path);
        if(!f.exists()) {
            try {
                f.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static void creaDirectory(String path) {
        File d = new File(path);
        if(!d.exists()) {
            d.mkdir();
        }
    }
}

LA CLASSE FILEWRITER

Quando creiamo un’istanza della classe FileWriter, al costruttore è necessario passare in ingresso un’istanza della classe File.

I metodi principali della classe FileWriter sono:

  • write(String str): scrive la stringa str nel file
  • close(): chiude lo stream sul file
  • flush(): garantisce che tutto il testo sia stato scritto nel file

LA CLASSE BUFFEREDWRITER

La classe FileWriter, come abbiamo detto, scrive un singolo carattere per volta. La classe BufferedWriter consente di scrivere su file in maniera più efficiente rispetto alla classe FileWriter. Quando creiamo un’istanza della classe BufferedWriter, al costruttore è necessario passare in ingresso un’istanza della classe FileWriter.

I metodi principali della classe BufferedWriter sono:

  • write(String str): scrive la stringa str nel file
  • newLine(): crea una nuova linea nel file. Il testo che segue questa istruzione viene scritto su una nuova linea.
  • close(): chiude lo stream sul file
  • flush(): garantisce che tutto il testo sia stato scritto nel file
package it.corso.java.gestionefile;

import java.io.*;

public class WriteClassFile {

    public static void write() {
        try {
            String dir = new File(new File(".").getCanonicalPath() + File.separator + "test-dir").getPath();
            esempioBufferedFileWriter(dir + File.separator + "buffered-writer.txt", new String[]{"Marco", "Albasini", "Corso Java", "Avanzato!"});
            esempioFileWriter(dir + File.separator + "file-writer.txt", new String("Corso Java avanzato"));
        }
        catch(IOException e) {
          e.printStackTrace();
        }
    }

    public static void esempioPrintWriter(String filePath, String[] testo) {
        PrintWriter pw = null;

        try {
            pw = new PrintWriter(new FileWriter(getFile(filePath)));

            for (String string : testo) {
                pw.write(string);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            pw.close();
        }
    }

    public static void esempioBufferedFileWriter(String filePath, String[] testo) {

        BufferedWriter bw = null;

        try {
            bw = new BufferedWriter(new FileWriter(getFile(filePath)));

            for (String string : testo) {
                bw.write(string);
                bw.newLine();
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void esempioFileWriter(String filePath, String testo) {
        FileWriter fw = null;
        try {
            fw = new FileWriter(getFile(filePath));
            fw.write(testo);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static File getFile(String filePath) {
        File file = new File(filePath);

        if(!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return file;
    }
}

LA CLASSE FILEREADER

Quando creiamo un’istanza della classe FileReader, al costruttore è necessario passare in ingresso un’istanza della classe File. I metodi principali della classe FileReader sono:

  • read(char[]): legge un numero finito di caratteri, uno alla volta, e li memorizza nell’array di char passato in ingresso
  • close(): chiude lo stream dal file.

LA CLASSE BUFFEREDREADER

La classe BufferedReader consente di leggere da un file in maniera più efficiente rispetto alla classe FileReader che legge un singolo carattere per volta. Quando creiamo un’istanza della classe BufferedReader, al costruttore è necessario passare in ingresso un’istanza della classe FileReader. I metodi principali della classe BufferedReader sono:

  • read(char[]): legge un numero finito di caratteri, uno alla volta, e li memorizza nell’array di char passato in ingresso
  • close(): chiude lo stream dal file
package it.corso.java.gestionefile;

import java.io.*;

public class ReadClassFile {

    public static void read(){
        try {
            String dir = new File(new File(".").getCanonicalPath() + File.separator + "test-dir").getPath();
            esempioFileReader(dir + File.separator + "lettura.txt");
            esempioBufferedReader(dir + File.separator + "lettura.txt");
        }
        catch(IOException ex){
            ex.printStackTrace();
        }
    }

    public static void esempioBufferedReader(String filePath) {
        File f = new File(filePath);
        if(f.exists()) {
            BufferedReader fr = null;
            try {
                fr = new BufferedReader(new FileReader(f));
                char[] testo = new char[1024];
                int size = fr.read(testo);
                for(int i = 0; i < size; i++) {
                    System.out.print(testo[i]);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public static void esempioFileReader(String filePath) {
        File f = new File(filePath);
        if(f.exists()) {
            FileReader fr = null;
            try {
                fr = new FileReader(f);
                char[] testo = new char[1024];
                int size = fr.read(testo);
                for(int i = 0; i < size; i++) {
                    System.out.print(testo[i]);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

LINK AI POST PRECEDENTI

IL LINGUAGGIO JAVA

LINK AL CODICE SU GITHUB

GITHUB

ESECUZIONE DEL CODICE DI ESEMPIO

  • Scaricare il codice da GITHUB, lanciare il file JAR con il seguente comando in Visual Studio Code, posizionandosi nella directory contenente il JAR.

        java -jar –enable-preview CorsoJava.jar

  • Oppure mettere in esecuzione il main che si trova nel file CorsoJava.java.