Les fichiers de texte en Java

1. Importations

Il faut importer toutes les classes suivantes, selon le "niveau" d'entrées/sorties souhaité :

2. Déclaration de variable

Pour utiliser un fichier de texte (stocké en général sur un disque dur) dans un programme, il faut déclarer une variable d'un type particulier qui "repésentera" ce fichier au sein du programme :
FileReader fr; (fr est le nom de la variable) pour lire dans le fichier, ou
[+] BufferedReader br; (br est le nom de la variable) pour lire efficacement dans le fichier, ou
[+] Scanner sr; (sr est le nom de la variable) pour lire facilement dans le fichier, ou
[++] idem ligne précédente
FileWriter fw; (fw est le nom de la variable) pour écrire dans le fichier.
[+] BufferedWriter bw; (bw est le nom de la variable) pour écrire efficacement dans le fichier.
[+] PrintWriter pw; (pw est le nom de la variable) pour écrire facilement dans le fichier.
[++] idem ligne précédente

3. Ouverture

4. Test d'ouverture

L'ouverture a pu mal se passer dans plusieurs cas, notamment : En général, il faut donc tester si l'ouverture s'est bien passée avant de commencer à lire ou à écrire dans un fichier supposé ouvert. Mais en Java, il suffit de mettre en place le traitement d'une exception, en l'occurence :
FileNotFoundException pour une ouverture en lecture, ou
IOException pour une ouverture en écriture.

Pour cela, il suffit d'écrire :
try { instructions_à_protéger } catch ( UneClasseException pObjetException ) { traitement_en_cas_d_erreur }

5. Lectures / écritures


6. Test de fin de fichier (en lecture)

Après de nombreuses opérations de lecture dans un fichier de texte, il se peut qu'il n'y ait plus rien à lire ! On dit alors qu'on a atteint la fin de fichier.
Selon les systèmes, lire au-delà de cette limite peut soit provoquer une erreur, soit simplement retourner toujours la même donnée. Il faut donc tester la fin de fichier AVANT chaque lecture (eh oui, le fichier peut être vide !) :
int car = -2;
while ( car != -1 ) {
  car = fr.read();
  if ( car != -1 )
    traitement du caractère lu
}

[+] int car = -2;
[+] while ( car != -1 ) {
[+]   car = br.read();
[+]   if ( car != -1 )
[+]     traitement du caractère lu
[+] }

[+] String ligne = "";
[+] while ( ligne != null ) {
[+]   ligne = br.readLine();
[+]   if ( ligne != null )
[+]     traitement de la ligne lue
[+] }

[+] while ( sr.hasNext() ) {
[+]   String mot = sr.next();
[+]   traitement du mot lu
[+] }

[+] while ( sr.hasNextLine() ) {
[+]   String ligne = sr.nextLine();
[+]   traitement de la ligne lue
[+] }

[+] while ( sr.hasNextInt() ) {
[+]   int e = sr.nextInt();
[+]   traitement de l'entier lu
[+] }
[+] Remarque : de même pour les byte, short, long, float, double, et boolean, mais pas pour les char.

[++] idem lignes précédentes



7. Fermeture

Comme expliqué au paragraphe "ouverture", le fichier est plus ou moins inaccessible aux autres programmes tant que le fichier reste ouvert. Il faut donc le fermer le plus tôt possible, c'est-à-dire dès qu'on n'en a plus besoin par l'instruction :
fr.close(); ou fw.close();
br.close(); ou bw.close();
sr.close(); ou pw.close();
idem ligne précédente

Il est souvent judicieux de placer ces instructions dans une clause finally, en les faisant précéder d'un test tel que : if ( sr != null )

8. Exemples de lectures

Soit un fichier contenant :
123  456
+789
 

On peut envisager au moins 4 manières de le lire (les virgules montrent à l'affichage la séparation entre les lectures) :

  1. caractère par caractère (car=br.read();), on obtient : '1','2','3',' ',' ','4','5','6','\n','+','7','8','9','\n'
  2. mot par mot (mot=sr.next();), on obtient : "123","456","+789"
  3. ligne par ligne (ligne=sr.nextLine();), on obtient : "123  456","+789"
  4. terme par terme (e=sr.nextInt();), on obtient : 123,456,789
    idem 3 lignes précédentes