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