FileReader 详细解析与记忆方法
一、FileReader 核心概念
FileReader
是 Java 中用于读取字符文件的类,继承自 InputStreamReader
,属于字符流体系。
1. 核心特点
特性 | 说明 |
---|---|
继承关系 | Reader → InputStreamReader → FileReader |
数据单位 | 字符(16位 Unicode) |
用途 | 读取文本文件(自动处理默认编码) |
是否缓冲 | 默认无缓冲(需配合 BufferedReader 使用) |
编码依赖 | 使用系统默认编码(可能因环境不同导致乱码) |
2. 构造方法
java
// 1. 通过文件路径创建
FileReader fr = new FileReader("text.txt");
// 2. 通过File对象创建
File file = new File("text.txt");
FileReader fr = new FileReader(file);
// 3. 通过文件描述符创建(较少用)
FileDescriptor fd = new FileDescriptor();
FileReader fr = new FileReader(fd);
3. 核心方法
方法 | 作用 |
---|---|
int read() |
读取单个字符(返回Unicode值,-1表示结束) |
int read(char[] cbuf) |
读取字符到数组,返回实际读取的字符数 |
int read(char[] cbuf, int off, int len) |
从偏移量off 开始读取len 个字符到数组 |
void close() |
关闭流 |
二、使用示例
1. 基础读取文件
java
try (FileReader fr = new FileReader("text.txt")) {
int charCode;
while ((charCode = fr.read()) != -1) {
System.out.print((char) charCode); // 转为字符输出
}
}
2. 高效读取(缓冲区)
java
try (BufferedReader br = new BufferedReader(new FileReader("text.txt"))) {
String line;
while ((line = br.readLine()) != null) { // 按行读取
System.out.println(line);
}
}
3. 读取到字符数组
java
char[] buffer = new char[1024];
try (FileReader fr = new FileReader("text.txt")) {
int charsRead;
while ((charsRead = fr.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, charsRead));
}
}
三、记忆技巧
1. 名称解析法
"File + Reader"
File:操作文件
Reader:字符输入流
2. 对比记忆法
对比类 | 数据单位 | 编码处理 | 典型用途 |
---|---|---|---|
FileReader |
字符 | 使用系统默认编码 | 读取系统默认编码的文本 |
InputStreamReader |
字符 | 可指定编码(如UTF-8) | 需要明确编码的文本读取 |
FileInputStream |
字节 | 无编码处理 | 二进制文件读取 |
3. 使用场景联想
读配置文件:
FileReader
+Properties.load()
日志分析:
BufferedReader
+FileReader
逐行处理文本处理:读取后按字符/行处理内容
4. 常见误区提醒
❌ 错误用法:用 FileReader
读取非默认编码文件(如UTF-8文件在GBK系统中)
✅ 解决方案:改用 InputStreamReader
并指定编码:
java
new InputStreamReader(new FileInputStream("text.txt"), "UTF-8");
四、面试高频问题
1. FileReader 和 FileInputStream 的区别?
FileReader:按字符读取(自动编码转换),适合文本
FileInputStream:按字节读取,适合二进制文件
2. 为什么读取中文有时会乱码?
原因:
FileReader
使用系统默认编码(如GBK),与文件实际编码(如UTF-8)不匹配解决:改用
InputStreamReader
明确指定编码
3. 如何高效读取大文本文件?
java
// 方案1:缓冲流按行读取
try (BufferedReader br = new BufferedReader(new FileReader("large.txt"))) {
br.lines().forEach(System.out::println);
}
// 方案2:NIO的Files工具类(Java 8+)
Files.lines(Paths.get("large.txt")).forEach(System.out::println);
4. FileReader 可以读取图片吗?
不可以:图片是二进制文件,应用
FileInputStream
后果:强行读取会导致数据损坏(字符流会尝试解码字节为字符)
五、总结图示
mermaid
flowchart TD
A[FileReader] --> B[读取文本文件]
A --> C[自动使用默认编码]
A --> D[需配合缓冲流提升性能]
B --> E[配置文件/日志等]
D --> F[BufferedReader]
一句话总结:
"FileReader读文本,默认编码要当心,缓冲读取更高效,二进制文件别用它"
掌握这些知识点后,文本文件读取将变得轻松高效! 🚀