BufferedReader 終極解析與記憶指南

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. 對比記憶表

對比維度BufferedReaderFileReader
讀取方式支持按行讀取只能按字符/數組讀取
緩沖機制有(默認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包裝!"

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901499.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901499.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901499.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

樹莓派超全系列教程文檔--(26)在 Raspberry Pi 上配置熱點

在 Raspberry Pi 上配置熱點 在 Raspberry Pi 上配置熱點啟用熱點禁用熱點使用 Raspberry Pi 作為網橋 文章來源&#xff1a; http://raspberry.dns8844.cn/documentation 原文網址 在 Raspberry Pi 上配置熱點 Raspberry Pi 可以使用無線模塊托管自己的無線網絡。如果您通過…

[硬件]單片機下載電路講解-以ch340為例

首先我們明確要實現的效果&#xff1a; 實現 CH340 通過 Type - C 接口下載程序到單片機 1、前置知識 首先我們要知道 ch340 和typec的作用分別是什么 CH340 作用(usb-ttl) CH340 是一種 USB 轉串口芯片 。其主要作用是實現 USB 總線與異步串行接口之間的轉換&#xff0c;充當 …

linux入門六:Linux Shell 編程

一、Shell 概述 1. 什么是 Shell&#xff1f; Shell 是 Linux 系統中用戶與內核之間的橋梁&#xff0c;作為 命令解析器&#xff0c;它負責將用戶輸入的文本命令轉換為計算機可執行的機器指令。 本質&#xff1a;Shell 是一個程序&#xff08;如常見的 Bash、Zsh&#xff09…

用shell腳本實現自動監控并封禁連接數超過閾值的IP

寫一個 shell 腳本&#xff0c;創建腳本文件 /usr/local/bin/check_conn.sh #!/bin/bash if [[ $EUID -ne 0 ]]; thenecho "This script must be run as root." >&2exit 1 fi # 連接數閾值 THRESHOLD50# 白名單 IP&#xff08;空格分隔&#xff09; WHITELIS…

VS 中Git 中本地提交完成,沒有推送,修改的內容如何還原

在 Visual Studio 中撤銷本地提交但未推送的修改&#xff0c;可以通過以下方法實現&#xff1a; 一、保留修改內容&#xff08;僅撤銷提交記錄&#xff09; 使用 git reset --soft 在 VS 的 Git 終端中執行&#xff1a; git reset --soft HEAD~1作用&#xff1a;撤銷最后一次提…

qt中的正則表達式

問題&#xff1a; 1.在文本中把dog替換成cat&#xff0c;但可能會把dog1替換成cat1&#xff0c;如果原本不想替換dog1&#xff0c;就會出現問題 2文本中想獲取某種以.txt為結尾的多有文本&#xff0c;普通的不能使用 3如果需要找到在不同的系統中尋找換行符&#xff0c;可以…

Linux命令-vim編輯

用vi或vim命令進入vim編輯器。 基礎: u 撤銷上一次操作。x剪切當前光標所在處的字符。yy復制當前行。dd剪切當前行。p粘貼剪貼板內容到光標下方。i切換到輸入模式&#xff0c;在光標當前位置開始輸入文本。:wq保存并退出Vim 編輯器。:q!不保存強制退出Vim 編輯器。 拓展: w光…

VS 基于git工程編譯版本自動添加版本號

目錄 概要 實現方案 概要 最近在用visual Studio 開發MFC項目時&#xff0c;需要在release版本編譯后的exe文件自動追加版本信息。 由于我們用的git工程管理&#xff0c;即需要基于最新的git 提交來打版本。 比如&#xff1a; MFCApplication_V1.0.2_9.exe 由于git 提交信…

nginx入門,部署靜態資源,反向代理,負載均衡使用

Nginx在linux上部署靜態資源 概念介紹 Nginx可以作為靜態web服務器來部署靜態資源。這里所說的靜態資源是指在服務端真實存在&#xff0c;并且能夠直接展示的一些文件&#xff0c;比如常見的html頁面、css文件、js文件、圖片、視頻等資源。 相對于Tomcat&#xff0c;Nginx處理…

【字節跳動AI論文】Seaweed-7B:視頻生成基礎模型的高成本效益培訓

摘要&#xff1a;本技術報告介紹了一種經濟有效的視頻生成基礎模型訓練策略。 我們提出了一種中等規模的研究模型&#xff0c;大約有70億個參數&#xff08;7B&#xff09;&#xff0c;稱為Seaweed-7B&#xff0c;使用665,000個H100 GPU小時從頭開始訓練。 盡管使用適度的計算資…

Java單例模式:實現全局唯一對象的藝術

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 一、什么是單例模式&#xff1f; 單例模式&#xff08;Singleton Pattern&#xff09;是一種創建型設計模式&#xff0c;確保一個類只有一個實例&#xff0c…

Oracle 復制表結構(含索引、主鍵)操作指南

Oracle 復制表結構&#xff08;含索引、主鍵&#xff09;操作指南 1. 復制基礎表結構 -- 創建空表結構&#xff08;不復制數據&#xff09; CREATE TABLE new_table AS SELECT * FROM old_table WHERE 10;2. 復制主鍵約束 -- 查詢原表主鍵信息 SELECT constraint_name, co…

React 更新state中的對象

更新 state 中的對象 state 中可以保存任意類型的 JavaScript 值&#xff0c;包括對象。但是&#xff0c;你不應該直接修改存放在 React state 中的對象。相反&#xff0c;當你想要更新一個對象時&#xff0c;你需要創建一個新的對象&#xff08;或者將其拷貝一份&#xff09;…

基于 GoFrame 框架的電子郵件發送實踐:優勢、特色與經驗分享

1. 引言 如果你是一位有1-2年Go開發經驗的后端開發者&#xff0c;可能已經熟悉了Go語言在性能和并發上的天然優勢&#xff0c;也曾在項目中遇到過郵件發送的需求——無論是用戶注冊時的激活郵件、系統異常時的通知&#xff0c;還是營銷活動中的批量促銷郵件&#xff0c;郵件功…

AndroidStudio編譯報錯 Duplicate class kotlin

具體的編譯報錯信息如下&#xff1a; Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21) D…

后端面試問題收集以及答案精簡版

思路 不要問什么答什么 要學會擴充 比如問你go map的原理 map 是什么 數據結構&#xff0c;字典&#xff0c;k/v 結構map的應用場景有哪些 快速查找、計數器、配置管理、去重、緩存實現map有哪些限制 無序性、非線程安全的讀寫map的key的訪問 v: mp[key] v,ok : mp[key] for…

MicroPython 開發ESP32應用教程 之 I2S、INMP441音頻錄制、MAX98357A音頻播放、SD卡讀寫

本課程我們講解Micropython for ESP32 的i2s及其應用&#xff0c;比如INMP441音頻錄制、MAX98357A音頻播放等&#xff0c;還有SD卡的讀寫。 一、硬件準備 1、支持micropython的ESP32S3開發板 2、INMP441數字全向麥克風模塊 3、MAX98357A音頻播放模塊 4、SD卡模塊 5、面包板及…

UE5 物理模擬 與 觸發檢測

文章目錄 碰撞條件開啟模擬關閉模擬 多層級的MeshUE的BUG 觸發觸發條件 碰撞 條件 1必須有網格體組件 2網格體組件必須有網格&#xff0c;沒有網格雖然可以開啟物理模擬&#xff0c;但是不會有任何效果 注意開啟的模擬的網格體組件會計算自己和所有子網格的mesh范圍 3只有網格…

微信小程序 - swiper輪播圖

官方文檔&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html <swiper indicator-color"ivory" indicator-active-color"#d43c33" indicator-dots autoplay><swiper-item><image src"/images/banner…

深入探究C#官方MCP:開啟AI集成新時代

一、引言 在當今數字化時代&#xff0c;.NET 開發領域不斷演進&#xff0c;而 C# 官方 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文協議&#xff09;的出現&#xff0c;無疑為開發者們帶來了全新的機遇與挑戰。隨著人工智能技術的迅猛發展&#xff0c;將 AI…