codestory

Die Anleitung zu Java FileReader

  1. FileReader
  2. Examples
  3. Das Problem UTF-8 BOM!

1. FileReader

FileReader ist eine Unterklasse von InputStreamReader, sie wird benutzt um die Textdatei zu lesen.
FileReader hat keine Methode mehr außer der von InputStreamReader geerbten Methoden. Tatsächlich können Sie InputStreamReader benutzen um die Zeichen aus der beliebten Quelle zu lesen. FileReader wird speziell zum Lesen von Zeichen aus dem Systemdatei entwickelt.
FileReader​ constructors
FileReader​(File file)    

FileReader​(FileDescriptor fd)    

FileReader​(File file, Charset charset)    

FileReader​(String fileName)    

FileReader​(String fileName, Charset charset)
Hinweis: Die Konstruktor mit dem Parameter Charset wird dem FileReader seit der Version Java 11 hinzufügt. Wenn Sie die frühere Version von Java benutzen und eine Datei mit der angegebenen Kodierung lesen möchten, benutzen Sie die Klasse InputStreamReader als Ersatz.

2. Examples

Z.B: Lesen Sie eine Textdatei:
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
Wenn Sie einen Textdatei lesen möchten, sollen Sie BufferedReader und FileReader verbinden um die beste Leistung zu schaffen:
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
Z.B: Lesen Sie einen Textdatei und drucken die Textzeile, die mit dem Zeichen '#' nicht beginnt (die Kommentarzeile):
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. Das Problem UTF-8 BOM!

Bevor UTF-8 populär wurde, fügten die UTF-8 Dateigeneratoren immer die ersten 3 bytes hinzu, um zu markieren, dass diese Datei UTF-8 kodiert war. Sie wurden häufig als BOM (Byte Order Mark) genannt. Inzwischen enthaltet die von Java generierten Dateien UTF-8 keine BOM.
FileReader entfernt BOM beim Lesen von Dateien UTF-8 nicht automatisch. Das Designteam Java ist sich diesen bewusst. Keine Aktualisierungsversion wird jedoch durchgeführt denn es die vorher auf Java geschriebenen Bibliotheke von der dritten Anbietern bricht, wie XML Parser, ...
Z.B, Unten finden Sie eine Datei UTF-8 (BOM), die von einem alten Tool generiert wurde. Sie können sie herunterladen, um das diskutierte Problem zu testen:
utf8-file-with-bom-test.txt
Hello
Und benutzen Sie FileReader um die obengemeinte File zu lesen:
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
Das Zeichen mit dem Kode 65279 tritt im Ergebnis auf. Das ist ein unerwünschtes Ergebniss.
Einige Klasse unten unterstützung bei dem Entfernen von BOM, die Sie überlegen zu benutzen:
BOMInputStream
BOMInputStream ist eine Klasse im Bibliothek Apache Commons IO , die bei dem Entfernen von BOM unterstützt.
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 ist eine Klasse im Bibliothek "Google Data Java Client Library", die das Entfern vonBOM unterstützt.
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

Die Anleitungen Java IO

Show More