1.11 Ecriture et lecture dans un fichier

Méthodologie pour écrire dans un fichier :

  • on utilise le package FileWriter, qu’il faut importer
  • on instancie un nouveau FileWriter fw en lui donnant le chemin vers le fichier en paramètre
  • on écrit dans le fichier
  • on ferme le FileWriter à la fin de l’écriture
import java.io.FileWriter;
FileWriter fw = new FileWriter('.\cheminVersFichier\fichier.txt');
fw.write(...);
fw.close();

On peut indiquer le chemin relatif avec .\ qui part de la racine de l’espace de travail (working directory ou workspace).

Méthodologie pour lire dans un fichier :

  • on utilise le package FileInputStream, qu’il faut importer
  • on instancie un nouveau FileInputStream fi en lui donnant le chemin vers le fichier en paramètre
  • on utilise le package Scanner, qu’il faut également importer
    • on instancie un nouveau Scanner scan en lui donnant le FileInputStream fi en paramètre
    • on lit les lignes une à une tant qu’il en reste avec une boucle while, scan.hasNextLine() et nextLine()
    • on ferme le Scanner à la fin des saisies
  • on ferme le FileInputStream à la fin de la lecture
import java.io.FileInputStream;
import java.util.Scanner;

FileInputStream fi = new FileInputStream('.\cheminVersFichier\fichier.txt');
Scanner scan = new Scanner(fi);
while(scan.hasNextLine()) {
  System.out.println(scan.nextLine());
}
scan.close();
fi.close();

Sauf que FileWriter et FileInputStream sont des méthodes qui lèvent obligatoirement des exceptions !! Il faut les entourer de try...catch :

import java.util.Scanner;
import java.io.FileWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.channels.FileLockInterruptionException;
import java.io.FileNotFoundException;
import java.io.IOException;


public class Ecriture {
    public static void main(String[] args) {
        FileWriter fw = null;
        try {
            fw = new FileWriter('.\Documents\tot.txt');
            fw.write("Hello world \n");
            for(int i=0;i<1000;i++) {
                fw.write(Integer.toString(i) + "\n");
            }
        } catch (IOException e) {
            System.out.println('Impossible d\'écrire dans le fichier');
        } finally {
            try {
                fw.close();
            } catch (IOException e) {
                System.out.println('Problème de fermeture');
            }
        }
    }
}

public class Lecture {

    public static void main(String[] args) {
        Scanner scan = null; 
        FileInputStream fichier = null;
        try {
            fichier = new FileInputStream('.\Documents\tot.txt');
            scan = new Scanner(fichier);
            while(scan.hasNextLine()) {
                System.out.println(scan.nextLine());
            }
        } catch (FileNotFoundException e) {
            System.out.println('Lecture impossible');
        } finally {
            scan.close();
            try {
                fichier.close();
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println('Fermeture impossible');
            }
        }
    }
}

Portée des variables : lorsqu’on ajoute le traitement des exceptions (try...catch), on déclare les variables en dehors pour y avoir accès.

Alternative : déclarer les FileWriter, FileInputStream et Scanner dans le try : try(FileWriter f = new FileWriter('./valeurs.txt') {...}