Java FileReader
最后修改时间:2024 年 3 月 31 日
在本文中,我们将展示如何使用 FileReader 类在 Java 中读取文本文件。
这些示例使用以下文本文件:
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 方法
在以下示例中,我们使用 FileReader 的 read 方法读取文本文件。 它将字符读取到数组中。 在有可用输入、发生 I/O 错误或到达流的末尾之前,它将一直阻塞。
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);
}
FileReader 的 read 方法将字符读取到数组中。 它返回读取的字符数,如果已到达流的末尾,则返回 -1。
使用 BufferedReader 读取
可以使用 BufferedReader 提高 FileReader 的性能。 BufferedReader 从字符输入流中读取文本,缓冲字符,以便有效地读取字符、数组和行。 可以指定缓冲区大小,也可以接受默认大小; 对于大多数用途,默认值都足够大。
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。
统计单词频率
在以下示例中,我们计算文本文件中单词的频率。
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教程。