Die Anleitung zu Java FileReader
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
- Die Anleitung zu Java CharArrayWriter
- Die Anleitung zu Java FilterReader
- Die Anleitung zu Java FilterWriter
- Die Anleitung zu Java PrintStream
- Die Anleitung zu Java BufferedReader
- Die Anleitung zu Java BufferedWriter
- Die Anleitung zu Java StringReader
- Die Anleitung zu Java StringWriter
- Die Anleitung zu Java PipedReader
- Die Anleitung zu Java LineNumberReader
- Die Anleitung zu Java PushbackReader
- Die Anleitung zu Java PrintWriter
- Die Anleitung zu Java IO Binary Streams
- Die Anleitung zu Java IO Character Streams
- Die Anleitung zu Java BufferedOutputStream
- Die Anleitung zu Java ByteArrayOutputStream
- Die Anleitung zu Java DataOutputStream
- Die Anleitung zu Java PipedInputStream
- Die Anleitung zu Java OutputStream
- Die Anleitung zu Java ObjectOutputStream
- Die Anleitung zu Java PushbackInputStream
- Die Anleitung zu Java SequenceInputStream
- Die Anleitung zu Java BufferedInputStream
- Die Anleitung zu Java Reader
- Die Anleitung zu Java Writer
- Die Anleitung zu Java FileReader
- Die Anleitung zu Java FileWriter
- Die Anleitung zu Java CharArrayReader
- Die Anleitung zu Java ByteArrayInputStream
- Die Anleitung zu Java DataInputStream
- Die Anleitung zu Java ObjectInputStream
- Die Anleitung zu Java InputStreamReader
- Die Anleitung zu Java OutputStreamWriter
- Die Anleitung zu Java InputStream
- Die Anleitung zu Java FileInputStream
Show More
- Anleitungen Java Servlet/JSP
- Die Anleitungen Java New IO
- Anleitungen Spring Cloud
- Die Anleitungen Oracle Java ADF
- Die Anleitungen Java Collections Framework
- Java Grundlagen
- Die Anleitungen Java Date Time
- Java Open Source Bibliotheken
- Anleitungen Java Web Services
- Die Anleitungen Struts2 Framework
- Anleitungen Spring Boot