Reader 是 Java 文本读取的抽象基类,按 Unicode 字符处理,子类 FileReader、BufferedReader、InputStreamReader 各司其职:FileReader 直接读文件但无缓冲;BufferedReader 提供缓冲和 readLine();InputStreamReader 解决编码不匹配问题;均需 try-with-resources 管理资源。

Java 字符输入流 Reader 是专为读取文本(字符)设计的抽象基类,它按 Unicode 字符(16 位 char)单位处理数据,天然支持多语言文本,避免了字节流手动解码的麻烦。实际使用时,不直接实例化 Reader,而是选用它的具体子类,核心在于“怎么读”和“怎么用”。
FileReader:最直接的文件字符读取方式
FileReader 是 Reader 的子类,用于从本地文本文件读取字符,内部默认使用平台或 IDE 的编码(如 UTF-8),适合简单场景。
- 构造时传入文件路径或 File 对象,例如:
new FileReader("data.txt") - 它继承了 Reader 的三个 read 方法:
-
read():每次读一个字符,返回 int 值(0–65535),读到末尾返回 -1 -
read(char[] cbuf):批量读入数组,返回实际读取的字符数 -
read(char[] cbuf, int off, int len):指定起始位置和最大长度,更灵活可控
-
- 注意:FileReader 不带缓冲,小文件可接受,大文件逐字符读效率低,且无法跳过换行或按行读取
BufferedReader:推荐的高效读取方案
BufferedReader 包装任意 Reader(如 FileReader),提供缓冲机制和按行读取能力,是生产环境最常用的方式。
- 必须用其他 Reader 实例构造,例如:
new BufferedReader(new FileReader("data.txt")) - 核心优势是
readLine()方法:一次读取一整行(不含换行符),返回 String,读到末尾返回 null - 仍支持
read()和read(char[]),但通常优先用readLine()处理结构化文本(如日志、配置、CSV 行) - 缓冲区减少磁盘 I/O 次数,性能明显优于裸 FileReader
InputStreamReader:精准控制编码的关键桥梁
当文件编码与默认编码不一致(比如文件是 GBK,而项目默认 UTF-8),直接用 FileReader 会乱码。此时需 InputStreamReader 显式指定编码。
- 它把字节流(如 FileInputStream)转为字符流,并允许传入 Charset 或编码名,例如:
new InputStreamReader(new FileInputStream("data.txt"), "GBK") - 常与 BufferedReader 组合:
new BufferedReader(new InputStreamReader(new FileInputStream("data.txt"), "UTF-8")) - 这是处理跨平台、旧系统生成文件或明确编码需求时的必备做法
读取逻辑与资源管理要点
无论用哪种 Reader,都要注意两个底层事实:
- 所有
read()类方法在流末尾都返回 -1,不能当作有效字符处理;转换成 char 时需先判断是否 ≥ 0 - 必须调用
close()释放系统资源(如文件句柄)。强烈建议用 try-with-resources 语法自动关闭,例如:try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) { ... } - 字符数组读取时,
read(char[])返回的是**本次实际读到的字符数**,不是数组长度,输出时需用new String(cbuf, 0, len)截取有效部分
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











