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包装!"