解決 InputStream 只能讀取一次問題

是的,InputStream 的一個重要特性是它通常只能被讀取一次。這是因為:

  1. 輸入流通常是單向的、順序訪問的數據源

  2. 很多流(如網絡流、文件流)讀取后指針就移動了,無法回退

  3. 有些流(如Socket流)甚至讀取后就消失了


使用 ByteArrayOutputStream 緩存數據

解決這個問題的常見方法是將 InputStream 的內容讀取到 ByteArrayOutputStream 中緩存起來,然后可以多次使用:

// 原始輸入流
InputStream originalInputStream = ...;// 創建字節數組輸出流作為緩沖區
ByteArrayOutputStream buffer = new ByteArrayOutputStream();// 將輸入流數據復制到緩沖區
byte[] data = new byte[1024];
int bytesRead;
while ((bytesRead = originalInputStream.read(data, 0, data.length)) != -1) {buffer.write(data, 0, bytesRead);
}buffer.flush();// 現在可以多次從緩沖區創建新的輸入流
InputStream copy1 = new ByteArrayInputStream(buffer.toByteArray());
InputStream copy2 = new ByteArrayInputStream(buffer.toByteArray());

其他替代方案

  1. 使用 mark() 和 reset() 方法(如果流支持):

if (inputStream.markSupported()) {inputStream.mark(Integer.MAX_VALUE);// 第一次讀取inputStream.reset();// 第二次讀取
}

使用 Apache Commons IO 工具類

IOUtils.toByteArray(inputStream);  // 類似于上面的手動方法
IOUtils.copy(inputStream, outputStream);

使用 Java 9+ 的 InputStream.transferTo()

ByteArrayOutputStream buffer = new ByteArrayOutputStream();
inputStream.transferTo(buffer);

注意事項

  • 這種方法會將所有數據加載到內存中,不適合處理非常大的流

  • 對于大文件,考慮使用臨時文件或其他存儲方式

  • 記得關閉原始輸入流和所有副本流

這種方法在需要多次處理相同流數據時非常有用,特別是在需要將同一份數據傳遞給多個處理器或消費者的場景中。

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

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

相關文章

數據分析面試題

技都測試 1、請列舉5個 Excel 中常用的函數及寫法。[ if ] IF(A1>60, "及格", "不及格") —— 若 A1 單元格數值≥60,返回 “及格”,否則返回 “不及格”。IF(B2>100, B2*0.8, B2) —— 若 B2 數值 > 100&#xff0c…

【07】VisionMaster入門到精通——Blob分折

文章目錄0 視屏講解與演示1 案例演示2 參數詳解1 運行參數0 視屏講解與演示 1 案例演示 周長使能查找U型槽 短軸使能查找U型槽 面積篩選區域 當條件不符合是,該模塊顯示紅色,狀態為NG 顯示二值圖像 顯示Blob圖像 2 參數詳解 Blob分折,…

解釋 MySQL 中的 EXPLAIN 命令的作用和使用場景

解釋 MySQL 中的 EXPLAIN 命令的作用和使用場景 總結性回答 EXPLAIN 是 MySQL 中用于分析 SQL 查詢執行計劃的命令,它能展示 MySQL 如何執行一個查詢,包括使用的索引、表連接順序、掃描行數等關鍵信息。主要用于查詢性能優化,幫助開發者識別潛…

.env 文件

.env 文件其實就是一個純文本文件,用來寫“環境變量”鍵值對,格式非常簡單 👇? .env 文件寫法格式:每一行就是一個變量名 值,不要加引號,不要加空格DEEPSEEK_API_KEYsk-xxxxxxxxxxxxxxxxxxxx完整例子&…

機器學習——K 折交叉驗證(K-Fold Cross Validation),案例:邏輯回歸 交叉尋找最佳懲罰因子C

什么是交叉驗證? 交叉驗證是一種將原始數據集劃分為若干個子集,反復訓練和驗證模型的策略。 交叉驗證(Cross-Validation)適用于你在模型調參(如邏輯回歸中的 C) 最常用的:K 折交叉驗證&#…

藍橋杯----串口

(五)、串口1、串口通信簡介制定通信的規則,通信雙方按照協議規則進行數據收發,將一個設備的數據傳送到另一個設備,擴展硬件系統,串口USART有兩根通信線Tx、Rx,可同時雙向通信,稱之為…

錯誤: 找不到或無法加載主類 原因: java.lang.ClassNotFoundException

背景: 代碼沒有更改,主類位置也沒有移動,運行時突然報找不到或無法加載主類的錯誤 錯誤: 找不到或無法加載主類 原因: java.lang.ClassNotFoundException編譯器上方顯示 Java file is located outside of the module source root so it wont …

Lock 接口及實現類詳解:從 ReentrantLock 到并發場景實踐

在 Java 并發編程中,除了synchronized關鍵字,java.util.concurrent.locks.Lock接口及其實現類是另一種重要的同步機制。自 JDK 5 引入以來,Lock接口憑借靈活的 API 設計、可中斷的鎖獲取、公平性控制等特性,成為復雜并發場景的首選…

「iOS」————SideTable

iOS學習前言sideTableSlideTablesSideTableBufSideTable前言 我們在上一篇中,簡單的介紹了weak的實現原理。其中弱引用表就是存儲在SideTable中的,這里我們來學習了解一下SideTable sideTable sideTable主要用于存儲和管理對象的額外信息,…

【PHP】CURL請求第三方API接口

當我們需要調用第三方接口時,就需要使用CURL,通過CURL操作去請求第三方API接口,有的是通過POST方式,有的是通過GET方式,下面介紹一個通用的使用CURL調用API接口的方法。一、CURL操作共兩個方法,分別是CURL操…

對于考研數學的理解

文章目錄高等數學總結補充說明1. 微分方程與無窮級數的特殊性2. 隱藏的邏輯鏈條3. 向量代數的橋梁作用核心框架為什么這樣設計?結論線性代數核心邏輯框架各講之間的本質聯系1. 行列式 → 矩陣2. 矩陣 → 向量組3. 矩陣 向量組 → 線性方程組4. 矩陣 → 特征值與特征…

基于 Hadoop 生態圈的數據倉庫實踐 —— OLAP 與數據可視化(四)

目錄 四、數據可視化與 Hue 簡介 1. 數據可視化簡介 (1)數據可視化的重要性 (2)數據可視化的用途 (3)實施數據可視化需要考慮的問題 (4)幾種主要的數據可視化工具 2. Hue 簡介…

HarmonyOS 開發:基于 ArkUI 實現復雜表單驗證的最佳實踐

摘要 在現代應用開發中,表單是最常見的交互方式之一。不管是用戶注冊、信息錄入,還是登錄驗證,表單的可靠性直接影響用戶體驗。而在鴻蒙 ArkUI 開發中,雖然表單結構清晰,但要實現 復雜驗證(比如&#xff1a…

高效游戲狀態管理:使用雙模式位運算與數學運算

在游戲開發中,狀態管理是一個核心問題。無論是任務系統、成就系統還是玩家進度跟蹤,我們都需要高效地存儲和查詢大量狀態。本文將深入分析一個創新的游戲狀態管理工具類 GameStateUtil,它巧妙結合了位運算和數學運算兩種模式,在存…

linux-process-control

Linux進程控制 1. 進程終止 1.1. 進程終止的本質是回收資源 1.1 釋放資源 內存資源: 釋放進程的地址空間(mm_struct),包括代碼段、數據段、堆、棧等,通過寫時復制(CoW)共享的頁會減少引用計數&a…

Autoswagger:揭露隱藏 API 授權缺陷的開源工具

Autoswagger 是一款免費的開源工具,用于掃描 OpenAPI 文檔中列出的 API,查找授權漏洞。 即使在擁有成熟安全團隊的大型企業中,這類漏洞仍然很常見,而且尤其危險,因為即使技術水平不高的人也能利用它們。 Autoswagger…

Golang 語言 Channel 的使用方式

一、無緩存 channel無緩沖channel 可用于兩個goroutine 之間 傳遞信號,比如以下示例:順序打印1 至 100 的奇數和偶數:import ("fmt""time" )func main() {block : make(chan struct{})go odd(block)go even(block)time.S…

Element Plus常見基礎組件(一)

基礎組件 Button 按鈕 一、基礎用法 <el-button>默認按鈕</el-button> <el-button type"primary">主要按鈕</el-button>二、按鈕類型 (type) 類型說明示例代碼default默認按鈕<el-button>默認</el-button>primary主要按鈕&a…

sdxl量化加速筆記

文章目錄一、量化加速sdxl模型1&#xff09;涉及模型2&#xff09;環境安裝3&#xff09;轉換模型safetensor to pytorch文件4&#xff09;tensorRT的環境準備&#xff08;1&#xff09;下載tensorRT 10.10&#xff08;2&#xff09;下載cuda一、量化加速sdxl模型 1&#xff0…

西門子 G120 變頻器全解析:從認知到參數設置

在工業自動化領域&#xff0c;變頻器作為電機驅動的核心設備&#xff0c;其穩定運行與精準控制直接影響生產效率。西門子 G120 變頻器憑借可靠性能與靈活配置&#xff0c;成為眾多工業場景的優選。本文將從基礎認知、操作面板到參數設置&#xff0c;全方位帶你掌握 G120 變頻器…