ZetCode

Java FileReader

最后修改时间:2024 年 3 月 31 日

在本文中,我们将展示如何使用 FileReader 类在 Java 中读取文本文件。

这些示例使用以下文本文件:

thermopylae.txt
The Battle of Thermopylae was fought between an alliance of
Greek city-states, led by King Leonidas of Sparta, and the Persian Empire of
Xerxes I over the course of three days, during the second Persian invasion of
Greece. 

FileReader 是一个 Java 便利类,用于读取文本文件。FileReader 扩展了 InputStreamReader 并创建了 FileInputStream

注意: 过去,FileReader 依赖于默认平台的编码。 自 Java 11 以来,该问题已得到纠正。 现在可以显式指定编码。 使用 FileReader 时,请始终指定编码。

read 方法

在以下示例中,我们使用 FileReaderread 方法读取文本文件。 它将字符读取到数组中。 在有可用输入、发生 I/O 错误或到达流的末尾之前,它将一直阻塞。

Main.java
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;


void main() throws IOException {

    var fileName = "thermopylae.txt";
    char[] buf = new char[1024];

    try (var fr = new FileReader(fileName, StandardCharsets.UTF_8)) {

        int c;
        while ((c = fr.read(buf)) != -1) {

            System.out.println(buf);
        }
    }
}

该示例读取一个文本文件。 它使用字符缓冲区来提高操作的性能。

try (var fr = new FileReader(fileName, StandardCharsets.UTF_8)) {

FileReader 的第一个参数是文件名。 第二个是编码类型。 我们使用 try-with-resources 结构来清理在写入完成后的资源。

int c;
while ((c = fr.read(buf)) != -1) {

    System.out.println(buf);
}

FileReaderread 方法将字符读取到数组中。 它返回读取的字符数,如果已到达流的末尾,则返回 -1。

使用 BufferedReader 读取

可以使用 BufferedReader 提高 FileReader 的性能。 BufferedReader 从字符输入流中读取文本,缓冲字符,以便有效地读取字符、数组和行。 可以指定缓冲区大小,也可以接受默认大小; 对于大多数用途,默认值都足够大。

Main.java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

void main() throws IOException {

    var fileName = "thermopylae.txt";

    try (var br = new BufferedReader(new FileReader(fileName,
            StandardCharsets.UTF_8))) {

        String line;
        while ((line = br.readLine()) != null) {

            System.out.println(line);
        }
    }
}

在此示例中,我们将 FileReader 包装到 BufferedReader 中以提高其性能。

String line;
while ((line = br.readLine()) != null) {

    System.out.println(line);
}

readLine 读取一行文本。 它返回包含该行内容的字符串,不包括任何行终止字符;如果在未读取任何字符的情况下到达流的末尾,则返回 null

统计单词频率

在以下示例中,我们计算文本文件中单词的频率。

Main.java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.nio.charset.StandardCharsets;


void main() throws IOException {

    var fileName = "thermopylae.txt";
    var wordFreq = new HashMap<String, Integer>();

    try (var bufferedReader = new BufferedReader(new FileReader(fileName, 
            StandardCharsets.UTF_8))) {

        String line;
        while ((line = bufferedReader.readLine()) != null) {

            var words = line.split("\s");

            for (var word : words) {

                if (word.endsWith(",") || word.endsWith("?")
                    || word.endsWith("!") || word.endsWith(".")) {

                    word = word.substring(0, word.length()-1);
                }

                if (wordFreq.containsKey(word)) {
                    wordFreq.put(word, wordFreq.get(word) + 1);
                } else {
                    wordFreq.put(word, 1);
                }

            }
        }

        wordFreq.forEach((k, v) -> {
            System.out.printf("%s -> %d%n", k, v);
        });
    }
}

我们逐行读取文件,并将行拆分为单词。 然后,我们从单词中删除任何可能的逗号、问号、感叹号或点。 单词的频率保存在哈希映射中。

来源

Java FileReader - 语言参考

在本文中,我们介绍了 Java FileReader 类。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有Java教程