BufferedReader 终极解析与记忆指南
一、核心本质
BufferedReader 是 Java 提供的缓冲字符输入流,继承自 Reader,通过内存缓冲和行读取功能极大提升文本读取效率。
核心特性速查表
| 特性 | 说明 | 
|---|---|
| 继承链 | Reader→BufferedReader | 
| 缓冲机制 | 默认 8KB 字符缓冲区(可自定义大小) | 
| 核心优势 | 提供 readLine()方法,支持按行读取文本 | 
| 性能提升 | 减少物理 I/O 操作次数 | 
| 线程安全 | 否 | 
二、构造方法
java
// 1. 基础构造(默认8KB缓冲区)
BufferedReader br = new BufferedReader(Reader in);// 2. 自定义缓冲区大小
BufferedReader br = new BufferedReader(Reader in, int size);典型初始化方式
java
// 文件读取标准写法
BufferedReader br = new BufferedReader(new FileReader("text.txt")); // 指定编码读取(避免乱码)
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("text.txt"), StandardCharsets.UTF_8));三、核心方法
| 方法 | 作用 | 
|---|---|
| String readLine() | 读取一行文本(不包含换行符)(通俗的讲就是,一读,读一行),返回null表示EOF 该方法每次读取一行,如果读取不到任何数据,则返回null,不是返回-1了(注意区别) | 
| int read() | 读取单个字符 | 
| int read(char[] cbuf) | 读取字符到数组 | 
| long skip(long n) | 跳过n个字符 | 
| void close() | 关闭流 | 
| Stream<String> lines() | (Java 8+) 返回文本行的Stream | 
| void mark(int readAheadLimit) | 在当前位置上打标记(有的流支持打标记,有的流不支持) | 
| void reset() | 回到上一次打标记的位置 | 
| 一般mark方法和reset方法组合使用,先调用mark(),再调用reset(),这两个方法组合起来完成的任务是:某段内容重复读取 | 
四、工作原理图解
mermaid
sequenceDiagramparticipant Programparticipant BufferedReaderparticipant ActualReaderProgram->>BufferedReader: readLine()alt 缓冲区有未读数据BufferedReader-->>Program: 直接返回一行文本else 需要填充缓冲区BufferedReader->>ActualReader: 批量读取8KB数据ActualReader-->>BufferedReader: 原始数据BufferedReader->>BufferedReader: 解码并缓冲数据BufferedReader-->>Program: 返回首行文本end五、实战代码模板
1. 基础按行读取
java
try (BufferedReader br = new BufferedReader(new FileReader("log.txt"))) {String line;while ((line = br.readLine()) != null) {System.out.println(line);}
}2. Java 8+ 流式处理
java
try (BufferedReader br = Files.newBufferedReader(Paths.get("data.txt"))) {br.lines().filter(l -> l.contains("error")).forEach(System.out::println);
}3. 读取到字符数组
java
char[] buffer = new char[1024];
try (BufferedReader br = ...) {int charsRead;while ((charsRead = br.read(buffer)) != -1) {String chunk = new String(buffer, 0, charsRead);// 处理片段...}
}六、性能对比数据
| 操作 | 直接读取 (FileReader) | 缓冲读取 (BufferedReader) | 
|---|---|---|
| 读取10万行日志文件 | ~1200ms | ~150ms (提升8倍) | 
| 搜索大文本文件 | ~3000ms | ~400ms (提升7.5倍) | 
七、记忆心法
1. 三字经记忆法
"包一层,读一行,快如风"
包:包装其他Reader
读一行:核心是
readLine()
快:缓冲机制加速
2. 对比记忆表
| 对比维度 | BufferedReader | FileReader | 
|---|---|---|
| 读取方式 | 支持按行读取 | 只能按字符/数组读取 | 
| 缓冲机制 | 有(默认8KB) | 无 | 
| 典型用途 | 日志分析、配置文件读取 | 低层字符操作 | 
3. 场景联想
想象读书:
-  无缓冲:每次从书架上拿一页看(效率低) 
-  有缓冲:一次拿一章放在手边随时翻阅(高效) 
八、高频面试题
1. readLine() 会包含换行符吗?
-  不包含!返回的字符串去掉了 \n或\r\n
2. 如何处理大文本文件?
java
// 方案1:传统逐行处理
try (BufferedReader br = ...) {String line;while ((line = br.readLine()) != null) {// 处理行...}
}// 方案2:Java 8 Stream API
br.lines().parallel().forEach(...);  // 并行处理3. 为什么读取中文乱码?如何解决?
-  原因:未正确指定编码(FileReader 用系统默认编码) 
-  解决: java 
new BufferedReader(new InputStreamReader(new FileInputStream("file.txt"), "UTF-8"));4. 缓冲区默认大小?如何调优?
-  默认8192字符(16KB内存) 
-  大文件可增大缓冲区: java 
new BufferedReader(reader, 32768);  // 32KB缓冲区九、终极总结
mermaid
pietitle BufferedReader核心价值"按行读取" : 40"减少I/O次数" : 35"编码处理灵活性" : 25黄金法则:
"所有文本读取操作,必须用BufferedReader包装!"