filereader是inputstreamreader子类,用默认编码读字符,但无法指定编码易乱码,且不支持按行读取;推荐用bufferedreader包装提升性能,或用inputstreamreader+fileinputstream明确指定编码。

FileReader 用于读取字符文件,本质是 InputStreamReader 的子类,底层自动使用平台默认编码(如 UTF-8 或 GBK)将字节转为字符。它适合读纯文本,但不推荐直接使用——因为不能指定编码,容易乱码;且不支持按行读取,需手动处理换行逻辑。
基本用法:逐个字符读取
调用 read() 方法返回 int 类型的字符(0–65535),读到末尾返回 -1:
- 每次只读一个字符,效率低,仅适合小文件或教学演示
- 必须用
int接收返回值,不能用char,否则无法区分有效字符和 -1 - 记得在 finally 中关闭流,或使用 try-with-resources 自动释放
推荐方式:配合 BufferedReader 按行读取
FileReader 本身没有 readLine(),但可以包装成 BufferedReader,大幅提升性能并支持按行处理:
- 缓冲区减少磁盘 I/O 次数,读大文件更稳定
-
readLine()返回String,自动去掉换行符(\n、\r\n 等) - 仍需注意编码问题——若文件是 UTF-8 保存但系统默认是 GBK,仍会乱码
更安全的替代方案:用 InputStreamReader + FileInputStream
如果需要明确控制编码,应绕过 FileReader,直接组合流:
- 用
FileInputStream读字节,再用InputStreamReader指定编码(如 "UTF-8")转字符 - 这样可避免 FileReader 的编码黑盒,也兼容非文本二进制场景
- 同样建议套上
BufferedReader提升效率
注意事项与常见问题
实际开发中容易踩坑的地方:
- 中文乱码:根本原因是编码不匹配,不是 FileReader 本身有 bug
- 资源未关闭:可能导致文件句柄泄漏,尤其在循环或高并发下
- 异常处理:
FileNotFoundException和IOException必须捕获或抛出 - 路径错误:相对路径以项目根目录或 JVM 启动目录为准,建议用
Paths.get(...)构造绝对路径
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











