非常好问题 👍 阿杰。BufferedReader
是 Java 中一个带缓冲功能的字符输入流类,用来 高效读取文本文件 或 字符数据。
你可以把它理解成:
“一个给 Reader 加上加速缓存的包装类”。
🧩 一、它在哪儿?
BufferedReader
属于 Java I/O 类库,包名是:
java.io.BufferedReader
它的典型使用场景是搭配 FileReader
或 InputStreamReader
一起使用。
⚙️ 二、主要作用
在 Java 中,文件或网络输入流通常是一字符一字符地读的(比如 FileReader
或 InputStreamReader
),效率非常低。
BufferedReader
加入了一个内存缓冲区(buffer),可以一次性读入一大块数据,再从内存中逐个取字符,大大提升性能。
就像这样:
不带缓冲:磁盘 → 每次读1个字符 → 程序
带缓冲:磁盘 → 一次读一大块 → 内存缓冲区 → 程序
💡 三、使用示例 1:读取文本文件
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Demo {
public static void main(String[] args) {
String path = "example.txt";
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
String line;
while ((line = br.readLine()) != null) { // 一行一行地读
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果(假设文件内容如下):
Hello, world!
This is a test.
程序输出:
Hello, world!
This is a test.
🧱 四、常用构造方法
构造方法 | 说明 |
---|---|
BufferedReader(Reader in) | 使用默认缓冲区大小(一般是 8192 字符) |
BufferedReader(Reader in, int size) | 手动指定缓冲区大小 |
例:
BufferedReader br = new BufferedReader(new FileReader("data.txt"), 16384);
🧾 五、常用方法
方法 | 说明 |
---|---|
String readLine() | 读取一整行文本(不包含换行符),到达文件末尾返回 null |
int read() | 读取单个字符,返回 Unicode 值 |
int read(char[] cbuf, int off, int len) | 读取多个字符到数组中 |
void close() | 关闭流(释放资源) |
🧠 六、与其他流的区别
类名 | 类型 | 说明 |
---|---|---|
FileReader | 字符输入流 | 直接从文件中读字符 |
BufferedReader | 包装流 | 对 Reader 加入缓冲,提高效率 |
InputStreamReader | 转换流 | 把字节流(如 FileInputStream )转成字符流 |
Scanner | 封装类 | 支持正则匹配、读取数字、字符串等更灵活操作 |
👉 通常组合使用:
BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream("data.txt"), "UTF-8"
)
);
🔍 七、使用示例 2:读取网络数据
import java.io.*;
import java.net.URL;
public class URLReader {
public static void main(String[] args) throws IOException {
URL url = new URL("https://example.com");
try (BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
}
⚠️ 八、使用注意事项
- 一定要关闭流:
推荐使用 try-with-resources 自动关闭:try (BufferedReader br = new BufferedReader(new FileReader("a.txt"))) { ... }
- readLine() 不包含换行符。
- 不是线程安全的。多线程读时要自己加锁或用其他并发工具。
- 适合读文本,不适合读二进制文件(如图片、视频)。
🚀 九、总结速查表
特性 | 内容 |
---|---|
包名 | java.io |
作用 | 对字符输入流加缓冲,提高读取效率 |
常搭配 | FileReader 、InputStreamReader |
常用方法 | readLine() 、read() 、close() |
是否线程安全 | 否 |
是否自动关闭 | 否(推荐 try-with-resources) |
适合用途 | 文本文件、配置文件、日志、网络文本流 |
发表回复