devstory

Le Tutoriel de Java FileReader

  1. FileReader
  2. Examples
  3. Le problème de UTF-8 BOM!

1. FileReader

FileReader est une sous-classe de InputStreamReader, qui est utilisée pour lire des fichiers texte.
FileReader ne dispose pas plus de méthodes que de celles héritées d'InputStreamReader, effectivement, vous pouvez utiliser InputStreamReader pour lire les caractères de n'importe quelle source. Cependant, FileReader est spécialement conçu pour lire les caractères du système de fichiers.
FileReader​ constructors
FileReader​(File file)    

FileReader​(FileDescriptor fd)    

FileReader​(File file, Charset charset)    

FileReader​(String fileName)    

FileReader​(String fileName, Charset charset)
Remarque: Les constructeurs ayant le paramètre Charset sont ajoutés à FileReader depuis Java 11. Par conséquent, si vous utilisez une version Java plus vieille et souhaitez lire un fichier avec l'encodage spécifié, vous devez utiliser une classe InputStreamReader pour remplacer.

2. Examples

Par exemple, lire un fichier texte:
file-test.txt
File Content
FileReaderEx1.java
package org.o7planning.filereader.ex;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.MalformedURLException;

public class FileReaderEx1 {

    public static void main(String[] args) throws MalformedURLException, IOException {
        File file = new File("file-test.txt");
 
        FileReader fis = new FileReader(file);
        
        int charCode;
        while((charCode = fis.read()) != -1) {
            System.out.println((char)charCode + "  " + charCode);
        }
        fis.close();
    }
}
Output:
F  70
i  105
l  108
e  101
   32
C  67
o  111
n  110
t  116
e  101
n  110
t  116
Lors de la lecture d'un fichier texte, vous devez utiliser une combinaison de BufferedReader et FileReader pour obtenir de meilleures performances:
students.txt
# Students:

John P
Sarah M
# Sarah B
Charles B
Mary T
Sophia B
FileReaderEx2.java
package org.o7planning.filereader.ex;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.net.MalformedURLException;

public class FileReaderEx2 {

    public static void main(String[] args) throws MalformedURLException, IOException {
        File file = new File("students.txt");
 
        Reader reader = new FileReader(file);
        BufferedReader br = new BufferedReader(reader);
        
        String line;
        while((line = br.readLine()) != null) {
            System.out.println(line);
        }
        br.close();
    }
}
Output:
# Students:

John P
Sarah M
# Sarah B
Charles B
Mary T
Sophia B
Exemple: Lire un fichier texte et imprimer les lignes de texte qui ne commencent pas par le caractère '#' (ligne de commentaire):
FileReaderEx3.java
package org.o7planning.filereader.ex;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.net.MalformedURLException;

public class FileReaderEx3 {

    public static void main(String[] args) throws MalformedURLException, IOException {
        File file = new File("students.txt");
 
        Reader reader = new FileReader(file);
        BufferedReader br = new BufferedReader(reader);
        
        br.lines() // java.util.stream.Stream
           .filter(line -> !line.startsWith("#")) // Not starts with "#".
           .forEach(System.out::println);
        
        br.close();
    }
}
Output:
John P
Sarah M
Charles B
Mary T
Sophia B

3. Le problème de UTF-8 BOM!

Avant que UTF-8 ne devienne populaire, les créateurs de fichiers UTF-8 ajoutaient toujours les 3 premiers bytes pour marquer que ce fichier était encodé en UTF-8, ils sont appelés BOM (Byte Order Mark). Alors que les fichiers UTF-8 créés par Java ne comprennent pas BOM.
FileReader ne supprime pas automatiquement BOM lors de la lecture de fichiers UTF-8. L'équipe de conception Java l'a compris. Cependant, aucune mise à jour n'a été effectuée car elle briserait les anciennes bibliothèques tierces basées sur Java telles que XML Parser, ...
Exemple, ci-dessous est un fichier UTF-8 (BOM) créé par un ancien outil, vous pouvez le télécharger pour tester le problème en cours de discussion:
utf8-file-with-bom-test.txt
Hello
Utiliser FileReader pour lire le fichier susmentionné:
FileReader_Utf8_BOM.java
package org.o7planning.filereader.ex;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.nio.charset.StandardCharsets;

public class FileReader_Utf8_BOM {

    public static void main(String[] args) throws MalformedURLException, IOException {
        File file = new File("utf8-file-with-bom-test.txt");  
        
        System.out.println("--- Read by FileReader ---");
        readByFileReader(file);
        
        System.out.println("--- Read by InputStreamReader ---");
        readByInputStreamReader(file);
    }

    private static void readByFileReader(File file) throws IOException {
        FileReader fr = new FileReader(file, StandardCharsets.UTF_8);

        int charCode;
        while ((charCode = fr.read()) != -1) {
            System.out.println((char) charCode + "  " + charCode);
        }
        fr.close();
    }
    
    private static void readByInputStreamReader(File file) throws IOException {
        InputStream is = new FileInputStream(file);

        InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);

        int charCode;
        while ((charCode = isr.read()) != -1) {
            System.out.println((char) charCode + "  " + charCode);
        }
        isr.close();
    }
}
Output:
--- Read by FileReader ---
  65279
H  72
e  101
l  108
l  108
o  111
--- Read by InputStreamReader ---
  65279
H  72
e  101
l  108
l  108
o  111
Le caractère avec le code 65279 apparaît dans le résultat, qui est un caractère indésirable.
Certaines des classes suivantes aident à éliminer BOM et vous pourriez envisager d'utiliser:
BOMInputStream
BOMInputStream est une classe de la bibliothèque Apache Commons IO qui aide à éliminer BOM.
Maven dependency
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>
BOMInputStreamEx1.java
package org.o7planning.filereader.ex;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

import org.apache.commons.io.input.BOMInputStream;

public class BOMInputStreamEx1 {

    public static void main(String[] args) throws IOException {
        File file = new File("utf8-file-with-bom-test.txt");
        FileInputStream fis = new FileInputStream(file);

        BOMInputStream bis = new BOMInputStream(fis);

        InputStreamReader isr = new InputStreamReader(bis, StandardCharsets.UTF_8);

        int charCode;
        while ((charCode = isr.read()) != -1) {
            System.out.println((char) charCode + "  " + charCode);
        }
        isr.close();
    }
}
Output:
H  72
e  101
l  108
l  108
o  111
UnicodeReader
UnicodeReader est une classe de la "Google Data Java Client Library" qui aide à supprimer BOM.
Maven dependency
<!-- https://mvnrepository.com/artifact/com.google.gdata/core -->
<dependency>
    <groupId>com.google.gdata</groupId>
    <artifactId>core</artifactId>
    <version>1.47.1</version>
</dependency>
UnicodeReaderEx1.java
package org.o7planning.filereader.ex;

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

import com.google.gdata.util.io.base.UnicodeReader;

public class UnicodeReaderEx1 {

    public static void main(String[] args) throws IOException {
        File file = new File("utf8-file-with-bom-test.txt");
        FileInputStream fis = new FileInputStream(file);
        
        UnicodeReader isr = new UnicodeReader(fis, "UTF-8");

        int charCode;
        while ((charCode = isr.read()) != -1) {
            System.out.println((char) charCode + "  " + charCode);
        }
        isr.close();
    }  
}
Output:
H  72
e  101
l  108
l  108
o  111

Tutoriels Java IO

Show More