FileReader是Java中基于默认编码读取字符流的类,适合小文本文件但易因编码不一致导致乱码;推荐用Files.newBufferedReader指定UTF-8等编码,配合try-with-resources确保资源安全释放。

FileReader 是 Java 中用于读取字符流的便捷类,它直接继承自 InputStreamReader,底层自动使用默认字符编码(通常是平台默认编码,如 Windows 的 GBK 或 macOS/Linux 的 UTF-8)将字节流解码为字符。适合读取纯文本文件(如 .txt、.csv、.log 等),但不推荐处理含中文或跨平台场景——因为默认编码不可控,容易乱码。
基本用法:逐字符读取
最简单的用法是用 read() 方法每次读一个字符(返回 int,-1 表示结束):
<font color="#888">try (FileReader reader = new FileReader("data.txt")) {
int ch;
while ((ch = reader.read()) != -1) {
System.out.print((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
}</font>
⚠️ 注意:read() 效率低,仅适合小文件或教学演示;实际开发中应避免单字符读取。
推荐方式:配合缓冲区批量读取
用 char[] 数组配合 read(char[] cbuf) 一次性读取多个字符,大幅提升性能:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
立即学习“Java免费学习笔记(深入)”;
- 数组长度通常设为 1024 或 8192(常见缓冲区大小)
- 该方法返回实际读到的字符数,可能小于数组长度
- 需用返回值控制输出范围,防止末尾残留旧数据
<font color="#888">try (FileReader reader = new FileReader("data.txt")) {
char[] buffer = new char[1024];
int len;
while ((len = reader.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, len));
}
} catch (IOException e) {
e.printStackTrace();
}</font>
更现代、更安全的替代方案
Java 7+ 推荐使用以下方式替代 FileReader:
- Files.lines() + try-with-resources:按行读取,自动处理编码(可指定 Charset)
- BufferedReader + InputStreamReader + FileInputStream:显式指定编码(如 UTF-8),避免乱码
例如明确用 UTF-8 读取:
<font color="#888">try (BufferedReader reader = Files.newBufferedReader(
Paths.get("data.txt"), StandardCharsets.UTF_8)) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}</font>
关键注意事项
-
FileReader没有构造方法支持指定编码,依赖系统默认编码 → 易导致中文乱码 - 务必使用 try-with-resources 自动关闭流,否则可能文件句柄泄漏
- 若文件路径不存在或无读取权限,会抛出
FileNotFoundException(属于IOException) - 读取二进制文件(如图片、PDF)请用
FileInputStream,勿用FileReader

















