Java中Reader是字符输入流抽象基类,核心方法read()返回Unicode码点,FileReader按系统编码读文件,BufferedReader提升效率并支持按行读取,指定编码需用InputStreamReader包装FileInputStream,批量读取char[]更实用。

Java 中的 Reader 是字符输入流的抽象基类,按字符读取文本数据的核心方式是调用其 read() 方法——每次返回一个字符的 Unicode 码点(int 类型),读到末尾返回 -1。
直接用 FileReader 按单个字符读取
FileReader 是 Reader 的子类,适合读取本地文本文件,默认使用系统编码(如 UTF-8 或 GBK)。它能直接按字符读取,无需手动处理字节解码:
- 调用
read()返回 int 值,需强制转为(char)才能得到可打印字符 - 循环读取直到返回 -1,表示文件结束
- 必须显式关闭流,或用 try-with-resources 自动释放资源
示例代码:
try (FileReader fr = new FileReader("data.txt")) {
int ch;
while ((ch = fr.read()) != -1) {
System.out.print((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
}
用 BufferedReader 包装后按行或按字符读取
FileReader 本身不带缓冲,频繁调用 read() 会产生大量 IO 操作。推荐用 BufferedReader 包装它,提升效率:
立即学习“Java免费学习笔记(深入)”;
-
readLine():一次读取一整行(不含换行符),返回String,读完返回null - 仍支持
read()和read(char[]),但底层已缓存,性能更好 - 缓冲区默认大小 8192 字符,减少底层系统调用次数
示例(逐行):
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
需要指定编码时,用 InputStreamReader + FileInputStream
FileReader 无法指定字符集,若文件是 UTF-8 编码但系统默认是 GBK,直接用 FileReader 可能乱码。此时应组合使用:
- 用
FileInputStream读字节 - 用
InputStreamReader将其转为字符流,并传入编码名(如 "UTF-8") - 再套一层
BufferedReader提升效率
示例:
try (BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream("data.txt"), "UTF-8"))) {
int ch;
while ((ch = br.read()) != -1) {
System.out.print((char) ch);
}
}
注意字符数组批量读取更实用
单字符读取逻辑清晰,但实际开发中更常用 read(char[] cbuf) 或 read(char[] cbuf, int off, int len):
- 一次读多个字符进数组,减少方法调用开销
- 返回值是实际读取的字符数,可能小于数组长度(尤其在末尾)
- 需用
new String(cbuf, 0, len)构造有效字符串,避免残留旧数据
不复杂但容易忽略。


















