reader 是 java io 包中所有字符读取流的抽象基类,专门用于处理文本数据。它通过内部缓冲和编码转换机制,将底层的字节流自动解码为 unicode 字符,从而让开发者直接操作字符串而非原始字节。使用 reader 的子类(如 filereader)可以简化代码,避免手动处理字符集转换的复杂性。

Reader 与 InputStream 的核心区别是什么
Reader 处理的是字符(char),而 InputStream 处理的是字节(byte)。前者关注文本语义,后者关注原始数据。在需要读取文件内容、网络文本或进行字符串处理时,应优先选择 Reader 体系。

import java.io.*;
public class ReaderDemo {
public static void main(String[] args) throws IOException {
// 创建字符输入流,默认使用系统编码
Reader reader = new FileReader("test.txt");
// 读取单个字符
int charData = reader.read();
// 关闭资源
reader.close();
System.out.println("Read char: " + (char)charData);
}
}
上述代码展示了最基础的 Reader 使用方式。通过 read() 方法,程序每次从输入源获取一个字符。如果文件为空,read() 将返回 -1。这种基于字符的读取方式天然支持多字节字符集(如 UTF-8),无需像 InputStream 那样手动拼接字节。
立即学习“Java免费学习笔记(深入)”;
如何正确使用 BufferedReader 提升读取效率
BufferedReader 是 Reader 最常用的装饰器子类,它通过引入缓冲区来减少 I/O 操作的次数。相比直接调用 FileReader 的 read() 方法,BufferedReader 提供了 readLine() 方法,能够一次性读取整行文本,显著提升处理大文件的性能。

import java.io.*;
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
// 包装 FileReade r以启用缓冲
Reader fileReader = new FileReader("test.txt");
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line;
// 逐行读取直到文件结束
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
bufferedReader.close();
}
}
在这个示例中,BufferedReader 包裹了原始的 FileReader。当调用 readLine() 时,底层会批量读取字节并转换为字符存入缓冲区,然后按行返回。这种方式避免了频繁的系统调用,是处理文本行的标准做法。注意,readLine() 返回的是不含换行符的字符串,若文件最后一行没有换行符,它依然会正确返回剩余内容。
Reader 在处理中文编码时需要注意什么
在使用 Reader 时,必须确保流的编码与文件实际编码一致,否则会出现乱码。FileReader 默认使用平台默认编码,这在跨平台环境下可能引发问题。推荐使用 InputStreamReader 显式指定编码格式,例如 UTF-8,以保证文本解析的正确性。
import java.io.*;
public class EncodingDemo {
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("test.txt");
// 显式指定 UTF-8 编码
Reader reader = new InputStreamReader(inputStream, "UTF-8");
int data;
StringBuilder sb = new StringBuilder();
while ((data = reader.read()) != -1) {
sb.append((char)data);
}
System.out.println(sb.toString());
reader.close();
}
}
该代码演示了如何通过 InputStreamReader 控制编码。即使文件是 UTF-8 编码,如果使用默认的 FileReader 且系统环境不是 UTF-8,读取结果将是错误的。通过显式传入编码参数,Reader 能正确地将多字节序列组合成正确的 Unicode 字符,解决中文乱码问题。


















