理解 FileReader 类的基本用途及其在字符流体系中的位置
掌握 FileReader 的三种构造方法及其适用场景
熟悉常用读取方法(如 read()、ready()、close() 等)的使用方式
能够编写程序通过 FileReader 逐字符或批量读取文本文件内容
区分字符流与字节流的使用场景,避免误用于二进制数据
FileReader 是 Java 中用于以字符形式读取文件内容的类。它属于字符输入流,专门用于处理文本文件。由于其内部自动处理字符编码,因此非常适合读取 .txt、.java、.csv 等纯文本格式。
注意:若需读取图片、音频、视频等二进制数据,应使用
FileInputStream,而非FileReader。
核心特性
基于 16 位 Unicode 字符:每次读取一个 char(即两个字节)
自动处理字符编码:默认使用平台默认编码(如 UTF-8、GBK 等)
跨平台兼容:在 Windows、Linux、macOS 上行为一致
继承自 InputStreamReader:是 Reader 抽象类的具体实现之一
FileReader 提供三种构造函数,适用于不同场景:
// 方式一:直接传入文件名
FileReader reader1 = new FileReader("data.txt");
// 方式二:先创建 File 对象
File file = new File("data.txt");
FileReader reader2 = new FileReader(file);
// 方式三:使用文件描述符(较少见)
FileDescriptor fd = FileDescriptor.in; // 标准输入
FileReader reader3 = new FileReader(fd);以下程序演示了两种读取方式:逐字符读取和批量读取。
import java.io.*;
class FileReaderDemo {
public static void main(String[] args) {
try {
// 创建 FileReader 实例
FileReader fileReader = new FileReader("example.txt");
System.out.println("逐字符读取:\n");
int ch;
while ((ch = fileReader.read()) != -1) {
System.out.print((char) ch);
}
// 重置流指针(注意:FileReader 不支持 reset,此处需重新打开)
fileReader = new FileReader("example.txt");
System.out.println("\n\n使用字符数组批量读取:\n");
char[] buffer = new char[10];
int count;
while ((count = fileReader.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, count));
}
// 关闭资源
fileReader.close();
System.out.println("\n\nFileReader 已关闭!");
} catch (IOException e) {
System.err.println("发生 I/O 错误: " + e.getMessage());
}
}
}提示:由于
FileReader内部没有缓冲机制,频繁调用read()效率较低。生产环境中建议配合BufferedReader使用以提升性能。
FileReader 是字符输入流,仅适用于文本文件
默认使用平台默认字符编码,如需指定编码(如 UTF-8),应使用 InputStreamReader 包装 FileInputStream
必须显式调用 close() 以释放文件句柄,否则可能导致资源泄漏
不支持 mark() / reset() 操作,不具备回退能力
高频读取时建议使用 BufferedReader 包装 FileReader 以提高效率
为什么不能用 FileReader 读取一张 JPG 图片?如果强行读取会发生什么?
FileReader 和 FileInputStream 在底层读取机制上有何本质区别?
如何修改上述示例,使其能够正确读取 UTF-8 编码的中文文本文件?