BufferedOutputStream 終極解析與記憶指南

BufferedOutputStream 終極解析與記憶指南

一、核心本質

BufferedOutputStream?是 Java 提供的緩沖字節輸出流,繼承自?FilterOutputStream,通過內存緩沖區顯著提升 I/O 性能。

核心特性速查表

特性說明
繼承鏈OutputStream?→?FilterOutputStream?→?BufferedOutputStream
緩沖機制默認 8KB 緩沖區(可自定義大小)
性能優勢減少磁盤 I/O 次數,小寫操作合并為批量寫
線程安全
自動刷新緩沖區滿時自動寫入,或調用?flush()/close()?時強制寫入

二、構造方法

java

// 1. 基礎構造(默認8KB緩沖區)
BufferedOutputStream bos = new BufferedOutputStream(OutputStream out);// 2. 自定義緩沖區大小
BufferedOutputStream bos = new BufferedOutputStream(OutputStream out, int size);

三、核心方法

方法作用
void write(int b)寫入單個字節(存入緩沖區)
void write(byte[] b)寫入字節數組(優先填充緩沖區)
void write(byte[] b, int off, int len)寫入數組指定范圍數據
void flush()強制將緩沖區內容寫入底層流
void close()先調用?flush(),再關閉底層流

四、工作原理圖解

mermaid

sequenceDiagramparticipant Programparticipant BufferedOutputStreamparticipant ActualStreamProgram->>BufferedOutputStream: write(data)BufferedOutputStream->>BufferedOutputStream: 數據存入緩沖區alt 緩沖區未滿BufferedOutputStream-->>Program: 立即返回else 緩沖區已滿BufferedOutputStream->>ActualStream: 批量寫入數據endProgram->>BufferedOutputStream: flush()BufferedOutputStream->>ActualStream: 立即寫入所有緩沖數據

五、實戰代碼模板

1. 基礎文件寫入

java

try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("data.bin"))) {bos.write(65); // 寫入'A'byte[] data = {66, 67, 68}; // B,C,Dbos.write(data);
} // 自動flush并關閉

2. 大文件高效寫入

java

// 使用16KB緩沖區 + 批量寫入
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("large.bin"), 16384)) {byte[] chunk = new byte[4096];// ...填充chunk數據...bos.write(chunk); // 批量寫入
}

3. 手動控制刷新

java

try (BufferedOutputStream bos = ...) {bos.write("重要數據".getBytes());bos.flush(); // 確保關鍵數據立即持久化// ...后續操作...
}

六、性能對比數據

操作直接寫入 (FileOutputStream)緩沖寫入 (BufferedOutputStream)
寫入10萬個小字節塊~1200ms~85ms (提升14倍)
寫入1GB大文件~4500ms~1800ms (提升2.5倍)

七、記憶心法

1. 三字經記憶法

"包一層,攢一波,滿則瀉"

  • :包裝其他輸出流

  • :積累小寫操作

  • :批量寫入磁盤

2. 對比記憶表

對比維度BufferedOutputStreamFileOutputStream
寫入策略攢夠一批再寫每次直接寫磁盤
適用場景高頻小數據寫入低頻大數據塊寫入
典型用法包裝其他流直接操作文件

3. 場景聯想

想象快遞員送包裹:

  • 無緩沖:每收到一個包裹就跑一趟快遞站(低效)

  • 有緩沖:攢滿一車再統一送貨(高效)


八、高頻面試題

1. 緩沖區默認大小?如何選擇?

  • 默認8KB,根據寫入模式調整:

    • 高頻小數據:增大緩沖區(如32KB)

    • 低頻大塊數據:可減小緩沖區

2. 不調用flush()會丟數據嗎?

  • 不會,但需注意:

    • 緩沖區滿時自動寫入

    • close()?會自動調用?flush()

    • 程序崩潰時未刷新數據會丟失

3. 為什么BufferedOutputStream不是線程安全的?

  • 緩沖區狀態(如?count?字段)未同步,多線程并發寫會導致數據錯亂

4. 緩沖流能提升多少性能?

  • 小數據寫入:10-100倍提升

  • 大數據塊寫入:2-5倍提升


九、終極總結

mermaid

pietitle BufferedOutputStream核心價值"減少磁盤I/O次數" : 45"合并小寫操作" : 35"提升吞吐量" : 20

黃金法則

"所有高頻小數據寫入,必須用緩沖流包裝!"

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

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

相關文章

光纖模塊全解:深入了解XFP、SFP、QSFP28等類型

隨著信息技術的快速發展,數據中心和網絡的帶寬需求不斷提高,光纖模塊的選擇與應用顯得尤為重要。光纖模塊是實現高速網絡連接的重要組件,選擇合適的模塊能夠顯著提升傳輸性能、降低延遲。本文將深入解析幾種常見的光纖模塊類型,包…

【高階數據結構】第三彈---圖的存儲與遍歷詳解:鄰接表構建與鄰接矩陣的BFS/DFS實現

?個人主頁: 熬夜學編程的小林 💗系列專欄: 【C語言詳解】 【數據結構詳解】【C詳解】【Linux系統編程】【高階數據結構】 目錄 1、圖的存儲結構 1.1、鄰接表 1.1.1、邊的結構 1.1.2、圖的基本結構 1.1.3、圖的創建 1.1.4、獲取頂點下…

OpenCV的詳細介紹與安裝(一)

1.OpenCV概述 OpenCV是一個開源的計算機視覺和機器學習軟件庫, 它輕量級而且高效——由一系列 C 函數和少量 C 類構成,它支持多種編程語言(如C、Python、Java),并可在Windows、Linux、macOS、Android和iOS等平臺上運行…

STM32F103_HAL庫+寄存器學習筆記15 - 梳理CAN發送失敗時,涉及哪些寄存器

導言 《STM32F103_LL庫寄存器學習筆記14 - CAN發送完成中斷》上一章節完成CAN發送完成中斷,在梳理二級發送緩存之前,先梳理怎樣監控CAN發送失敗。 如上所示: 當我關掉CAN分析儀的CAN通道1,CAN錯誤狀態寄存器CAN_ESR的TEC&#x…

Linux——Shell編程之循環語句(筆記)

For循環語句 1、for語句的結構與邏輯: 使用for循環語句時,我們需要指定一個變量以及取值列表,針對每個不同的取值重復執行相同的命令序列,直到變量使用完退出循環。結構如下: for 變量 in 取值列表do命令序列done 對于for語句的…

【權限】v-hasPermi=“[‘monitor:job:add‘]“ 這個屬性是怎么控制能不能看到這個按鈕

背景&#xff1a;對于前臺中通過指令對于操作按鈕的控制是怎么實現的&#xff1a; <el-col :span"1.5"><el-buttontype"primary"plainicon"Plus"click"handleAdd"v-hasPermi"[system:role:add]">新增</el-bu…

ISIS路由引入

?基本概念與作用? ISIS&#xff08;Intermediate System to Intermediate System&#xff09;協議的路由引入&#xff08;Route Import&#xff09;功能用于將其他路由協議&#xff08;如OSPF、BGP&#xff09;或靜態/直連路由引入ISIS域&#xff0c;實現跨協議的路由信息共…

CentOS7更換國內YUM源和Docker簡單應用

配置國內阿里云鏡像源 ## 更新鏡像源 # 1.備份 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak# 2.替換鏡像源文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo# 3.生成緩存 yum clean all yum m…

常見的 14 個 HTTP 狀態碼詳解

文章目錄 一、2xx 成功1、200 OK2、204 No Content3、206 Partial Content 二、3xx 重定向1、301 Moved Permanently2、302 Found3、303 See Other注意4、Not Modified5、307 Temporary Redirect 三、4xx 客戶端錯誤1、400 Bad Request2、401 Unauthorized3、403 Forbidden4、4…

RAG(檢索增強生成)學習路徑全解析:從入門到精通

引言 檢索增強生成&#xff08;Retrieval Augmented Generation&#xff0c;簡稱RAG&#xff09;是一種結合了信息檢索技術與語言生成模型的人工智能技術。它通過從外部知識庫中檢索相關信息&#xff0c;然后將其作為上下文輸入到大語言模型&#xff08;LLM&#xff09;中&…

OpenAI為搶跑AI,安全底線成犧牲品?

幾年前&#xff0c;如果你問任何一個AI從業者&#xff0c;安全測試需要多長時間&#xff0c;他們可能會淡定地告訴你&#xff1a;“至少幾個月吧&#xff0c;畢竟這玩意兒可能改變世界&#xff0c;也可能毀了它。”而現在&#xff0c;OpenAI用實際行動給出了一個新答案——幾天…

解決在linux下運行rust/tauri項目出現窗口有內容,但是渲染出來成純黑問題

起因 最近折騰了一下rust/tauri程序開發&#xff0c;據說這玩意性能非常牛皮就玩了一下&#xff0c;但是我運行打包一直出現一個奇怪問題&#xff0c;窗口能正常打開&#xff0c;但是是純黑的什么內容都沒有&#xff0c;鼠標移上去又發現指針會變換&#xff08;看起來是內容又…

高并發內存池(定長內存池基礎)

定長內存池的設計 定長內存池定長內存池的原理講解代碼實現定義對象New對象的主要邏輯delete對象的主要邏輯完整代碼 定長內存池 為什么我們要設計這個定長內存池呢&#xff1f;首先malloc是c標準庫中向堆申請空間的接口&#xff0c;變相的說malloc是普遍性&#xff0c;而我們…

【VUE3】練習項目——大事件后臺管理

目錄 0 前言 1 準備工作 1.1 安裝pnpm 1.2 創建vue項目 1.3 Eslint & Prettier的配置 1.4 husky 提交代碼檢查 1.5 目錄調整 1.6 VueRouter4 1.6.1 基礎配置 1.6.2 路由跳轉 1.7 引入 Element Plus 組件庫 1.8 Pinia 1.8.1 優化 1.9 封裝請求工具 1.9.1 安…

WebSocket與MQTT

在物聯網&#xff08;IoT&#xff09;領域&#xff0c;?WebSocket和MQTT確實都可以實現實時通信&#xff0c;但它們的核心設計目標、適用場景和角色存在顯著差異。以下是兩者的對比分析&#xff1a; ?1. 協議設計初衷? ?WebSocket? ?目標?&#xff1a;提供瀏覽器與服務器…

Mysql為什么有時候會選錯索引

案例 正常情況 有一個表t ( id, a , b )&#xff0c;id是主鍵索引&#xff0c;a是Normal索引。 正常情況下&#xff0c;針對a進行查詢&#xff0c;可以走索引a 并且查詢的數量和預估掃描行數是差不多的&#xff0c;都是10001行 奇怪的現象 隨著時間的變化&#xff0c;后…

[250414] ArcoLinux 項目宣布逐步結束

目錄 ArcoLinux 項目宣布逐步結束 ArcoLinux 項目宣布逐步結束 備受歡迎的 Arch Linux 發行版 ArcoLinux 近日宣布&#xff0c;其項目將逐步結束。ArcoLinux 以其作為 Linux 教育平臺和提供多種安裝選項&#xff08;從完整桌面環境到最小化基礎安裝&#xff09;而聞名。 核心…

opencv人臉性別年齡檢測

一、引言 在計算機視覺領域&#xff0c;人臉分析是一個熱門且應用廣泛的研究方向。其中&#xff0c;人臉性別年齡檢測能夠自動識別圖像或視頻流中人臉的性別和年齡信息&#xff0c;具有諸多實際應用場景&#xff0c;如市場調研、安防監控、用戶個性化體驗等。OpenCV 作為一個強…

【NLP】 22. NLP 現代教程:Transformer的訓練與應用全景解讀

&#x1f9e0; NLP 現代教程&#xff1a;Transformer的訓練與應用全景解讀 一、Transformer的使用方式&#xff08;Training and Use&#xff09; 如何使用Transformer模型&#xff1f; Transformer 模型最初的使用方式有兩種主要方向&#xff1a; 類似 RNN 編碼-解碼器的架…

Spring Boot 集成 RocketMQ 全流程指南:從依賴引入到消息收發

前言 在分布式系統中&#xff0c;消息中間件是解耦服務、實現異步通信的核心組件。RocketMQ 作為阿里巴巴開源的高性能分布式消息中間件&#xff0c;憑借其高吞吐、低延遲、高可靠等特性&#xff0c;成為企業級應用的首選。而 Spring Boot 通過其“約定優于配置”的設計理念&a…