reader是抽象类,需用filereader等子类实例化;核心方法read(char[] cbuf)批量读取字符到指定数组并返回实际数量,常配合循环使用;重载方法read(char[] cbuf, int off, int len)支持偏移写入;禁止单字符read()低效填充数组。

Reader 本身是抽象类,不能直接实例化,实际使用时需选择具体子类(如 FileReader、InputStreamReader、StringReader 等)。它不提供“一次性读取整个字符数组”的方法,但支持**将数据批量读入你提供的字符数组中**——这是最常用、最高效的方式。
用 read(char[] cbuf) 读入指定数组
这是 Reader 的核心读取方法之一。它尝试从源中读取最多 cbuf.length 个字符,存入你传入的数组,并返回实际读到的字符数;如果已到流末尾,则返回 -1。
- 数组由你创建和管理,Reader 只负责往里填数据
- 每次调用不会自动清空数组,未读取位置的内容保持不变(可能残留旧数据)
- 通常需循环调用,直到返回 -1
示例:
char[] buffer = new char[1024];int len;
while ((len = reader.read(buffer)) != -1) {
System.out.print(new String(buffer, 0, len)); // 只打印本次读到的部分
}
用 read(char[] cbuf, int off, int len) 更精确控制写入位置
当你不想覆盖整个数组,或想把新内容追加到数组某段区域时,用这个重载方法。它从 cbuf[off] 开始写入,最多写 len 个字符。
-
off是起始下标,必须 ≥ 0 -
len是最大写入长度,必须 ≥ 0,且off + len ≤ cbuf.length - 返回值同样是实际读取的字符数,可能小于
len
适用场景:拼接多段读取结果、实现自定义缓冲逻辑等。
注意:不要误用 read() 单字符方法填充数组
reader.read() 返回单个 int(0–65535),不是字符数组。若强行用它逐个赋值到数组,效率极低,且易出错(比如没处理 -1 或类型转换问题)。
- 避免这样写:
for (int i = 0; i - 正确做法始终优先使用
read(char[])批量读取
完整可运行小例子(StringReader 演示)
便于快速验证逻辑:
StringReader reader = new StringReader("Hello世界");char[] buf = new char[4];
int n;
while ((n = reader.read(buf)) != -1) {
System.out.println("读到 " + n + " 个字符: \"" + new String(buf, 0, n) + "\"");
}
// 输出:
// 读到 4 个字符: "Hell"
// 读到 4 个字符: "o世"
// 读到 1 个字符: "界"
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











