非常好问题 👍 阿杰。
BufferedReader 是 Java 中一个带缓冲功能的字符输入流类,用来 高效读取文本文件字符数据
你可以把它理解成:

“一个给 Reader 加上加速缓存的包装类”。


🧩 一、它在哪儿?

BufferedReader 属于 Java I/O 类库,包名是:

java.io.BufferedReader

它的典型使用场景是搭配 FileReaderInputStreamReader 一起使用。


⚙️ 二、主要作用

在 Java 中,文件或网络输入流通常是一字符一字符地读的(比如 FileReaderInputStreamReader),效率非常低。

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);
            }
        }
    }
}


⚠️ 八、使用注意事项

  1. 一定要关闭流
    推荐使用 try-with-resources 自动关闭: try (BufferedReader br = new BufferedReader(new FileReader("a.txt"))) { ... }
  2. readLine() 不包含换行符
  3. 不是线程安全的。多线程读时要自己加锁或用其他并发工具。
  4. 适合读文本,不适合读二进制文件(如图片、视频)

🚀 九、总结速查表

特性内容
包名java.io
作用对字符输入流加缓冲,提高读取效率
常搭配FileReaderInputStreamReader
常用方法readLine()read()close()
是否线程安全
是否自动关闭否(推荐 try-with-resources)
适合用途文本文件、配置文件、日志、网络文本流