ByteArrayInputStream 類詳解

ByteArrayInputStream 類詳解

ByteArrayInputStream 是 Java 中用于從字節數組讀取數據的輸入流,位于 java.io 包。它允許將內存中的字節數組當作輸入流來讀取,是處理內存數據的常用工具。


1. 核心特性

  • 內存數據源:從字節數組(byte[])讀取數據
  • 無需關閉close() 方法為空操作(無系統資源需要釋放)
  • 線程不安全:多線程訪問需外部同步
  • 支持標記/重置:可重復讀取數據(mark()reset()

2. 類繼承關系

InputStream
ByteArrayInputStream

3. 構造方法

構造方法說明
ByteArrayInputStream(byte[] buf)使用整個字節數組作為數據源
ByteArrayInputStream(byte[] buf, int offset, int length)使用數組的指定區間

4. 核心方法

(1)讀取數據

方法說明
int read()讀取單個字節(返回0-255,-1表示結束)
int read(byte[] b, int off, int len)讀取數據到字節數組
long skip(long n)跳過指定字節數

示例

byte[] data = {72, 101, 108, 108, 111}; // "Hello"的ASCII碼
ByteArrayInputStream bais = new ByteArrayInputStream(data);int byteRead;
while ((byteRead = bais.read()) != -1) {System.out.print((char) byteRead); // 輸出: Hello
}

(2)流控制

方法說明
int available()返回剩余可讀字節數
void mark(int readlimit)標記當前位置(readlimit 參數被忽略)
void reset()重置到標記位置(默認是起始位置)
boolean markSupported()始終返回 true(支持標記)

標記/重置示例

bais.mark(0); // 標記起始位置
System.out.print((char) bais.read()); // 讀取'H'
bais.reset();  // 重置回起始位置
System.out.print((char) bais.read()); // 再次讀取'H'

5. 使用場景

(1)內存數據處理

byte[] pdfData = generatePdf();
try (ByteArrayInputStream bais = new ByteArrayInputStream(pdfData);PDFParser parser = new PDFParser(bais)) {// 解析PDF數據
}

(2)單元測試模擬輸入

// 模擬用戶輸入
String input = "test\n123\n";
ByteArrayInputStream testInput = new ByteArrayInputStream(input.getBytes());
System.setIn(testInput); // 重定向System.inScanner scanner = new Scanner(System.in);
System.out.println(scanner.nextLine()); // 輸出: test

(3)與其他流配合

byte[] compressedData = getGzipData();
try (ByteArrayInputStream bais = new ByteArrayInputStream(compressedData);GZIPInputStream gzis = new GZIPInputStream(bais)) {// 解壓數據
}

6. 性能優化

(1)批量讀取

byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = bais.read(buffer)) != -1) {process(buffer, 0, bytesRead);
}

(2)避免頻繁創建

// 復用ByteArrayInputStream(調用reset()后重新讀取)
bais.reset(); 

7. 與 ByteArrayOutputStream 對比

特性ByteArrayInputStreamByteArrayOutputStream
方向讀取數據寫入數據
數據源已有字節數組動態增長緩沖區
關閉需求非必需非必需
典型用途解析內存數據收集輸出數據

8. 常見問題

(1)數組越界

  • 錯誤示例
    byte[] smallArray = new byte[10];
    ByteArrayInputStream bais = new ByteArrayInputStream(smallArray, 5, 10); // 拋出IndexOutOfBoundsException
    
  • 解決:確保 offset + length ≤ buf.length

(2)編碼轉換

  • 正確方式
    byte[] utf8Bytes = "中文".getBytes("UTF-8");
    ByteArrayInputStream bais = new ByteArrayInputStream(utf8Bytes);
    String text = new String(toByteArray(bais), "UTF-8");
    

9. 實戰案例

(1)Base64 解碼

String base64 = "SGVsbG8="; // "Hello"的Base64編碼
byte[] decoded = Base64.getDecoder().decode(base64);
ByteArrayInputStream bais = new ByteArrayInputStream(decoded);
// 使用解碼后的數據...

(2)圖像處理

byte[] imageData = getImageBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
BufferedImage image = ImageIO.read(bais);

10. 總結

  • 適用場景:內存數據解析、測試數據模擬、與其他流配合
  • 優勢:無需物理I/O,輕量高效
  • 注意:大數據量需考慮內存限制

擴展練習

  1. 實現一個方法,將 ByteArrayInputStream 內容復制到 ByteArrayOutputStream
  2. 結合 DataInputStream 讀取結構化二進制數據

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

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

相關文章

rvalue引用()

一、先確定基礎:左值(Lvalue)和右值(Rvalue) 理解Rvalue引用,首先得搞清楚左值和右值的概念。 左值(Lvalue):有明確內存地址的表達式,可以取地址。比如變量名、引用等。 復制代碼 int a = 10; // a是左值 int& ref = a; // ref也是左值右值(Rval…

吳恩達深度學習作業 RNN模型——字母級語言模型

一. 簡單復習一下RNN RNN RNN適用于處理序列數據,令是序列的第i個元素,那么就是一個長度為的序列,NLP中最常見的元素是單詞,對應的序列是句子。 RNN使用同一個神經網絡處理序列中的每一個元素。同時,為了表示序列的…

基于python的哈希查表搜索特定文件

Python有hashlib庫,支持多種哈希算法,比如MD5、SHA1、SHA256等。通常SHA256比較安全,但MD5更快,但可能存在碰撞風險,得根據自己需求決定。下面以SHA256做例。 import hashlib import os from typing import Dict, Lis…

idea創建springboot項目無法創建jdk8原因及多種解決方案

idea創建springboot項目無法創建jdk8原因及多種解決方案 提示:幫幫志會陸續更新非常多的IT技術知識,希望分享的內容對您有用。本章分享的是springboot的使用。前后每一小節的內容是存在的有:學習and理解的關聯性。【幫幫志系列文章】&#x…

【C++進階十】多態深度剖析

【C進階十】多態深度剖析 1.多態的概念及條件2.虛函數的重寫3.重寫、重定義、重載區別4.C11新增的override 和final5.抽象類6.虛表指針和虛表6.1什么是虛表指針6.2指向誰調用誰,傳父類調用父類,傳子類調用子類 7.多態的原理8.單繼承的虛表狀態9.多繼承的…

面向網絡安全的開源 大模型-Foundation-Sec-8B

1. Foundation-Sec-8B 整體介紹 Foundation-Sec-8B 是一個專注于網絡安全領域的大型語言模型 (LLM),由思科的基礎人工智能團隊 (Foundation AI) 開發 。它基于 Llama 3.1-8B 架構構建,并通過在一個精心策劃和整理的網絡安全專業語料庫上進行持續預訓練而得到增強 。該模型旨在…

Python爬蟲的基礎用法

Python爬蟲的基礎用法 python爬蟲一般通過第三方庫進行完成 導入第三方庫(如import requests ) requests用于處理http協議請求的第三方庫,用python解釋器中查看是否有這個庫,沒有點擊安裝獲取網站url(url一定要解析正確&#xf…

WHAT - Tailwind CSS + Antd = MetisUI組件庫

文章目錄 Tailwind 和 Antd 組件庫MetisUI 組件庫 Tailwind 和 Antd 組件庫 在 WHAT - Tailwind 樣式方案(不寫任何自定義樣式) 中我們介紹了 Tailwind,至于 Antd 組件庫,我們應該都耳熟能詳,官網地址:htt…

Day 4:牛客周賽Round 91

好久沒寫了,問題還蠻多的。聽說這次是苯環哥哥出題 F題 小苯的因子查詢 思路 考慮求因子個數,用質因數分解;奇數因子只需要去掉質數為2的情況,用除法。 這里有個比較妙的細節是,提前處理出數字x的最小質因數&#xff0…

使用直覺理解不等式

問題是這個: 題目 探究 ∣ max ? b { q 1 ( z , b ) } ? max ? b { q 2 ( z , b ) } ∣ ≤ max ? b ∣ q 1 ( z , b ) ? q 2 ( z , b ) ∣ |\max_b\{q_1(z,b)\}-\max_b\{q_2(z,b)\}|\le\max_b|q_1(z,b)-q_2(z,b)| ∣maxb?{q1?(z,b)}?maxb?{q2?(z,b)}∣≤…

惡心的win11更新DIY 設置win11更新為100年

?打開注冊表編輯器?:按下Win R鍵,輸入regedit,然后按回車打開注冊表編輯器。?12?導航到指定路徑?:在注冊表編輯器中,依次展開HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings?新建DWORD值?&…

嵌入式驅動學習

時鐘 定義 周期型的0、1信號 時鐘信號由“心臟”時鐘源產生,通過“動脈”時鐘樹傳播到整個芯片中。 SYSCLK系統時鐘,由HSI、HSE、PLLCLK三選一。 HCLK是AHB總線時鐘, PCLK是APB總線時鐘。 使用某個外設,必須要先使能該外設時鐘系統…

Java:從入門到精通,你的編程之旅

Java,一門歷久彌新的編程語言,自誕生以來就以其跨平臺性、面向對象、穩定性和安全性等特性,在企業級應用開發領域占據著舉足輕重的地位。無論你是初學者還是經驗豐富的開發者,Java 都能為你提供強大的工具和廣闊的舞臺。 為什么選…

Linux:深入理解數據鏈路層

實際上一臺主機中,報文并沒有通過網絡層直接發送出去,而是交給了自己的下一層協議——數據鏈路層!! 一、理解數據鏈路層 網絡層交付給鏈路層之前,會先做決策再行動(會先查一下路由表,看看目標網…

Python基本語法(類和實例)

類和實例 類和對象是面向對象編程的兩個主要方面。類創建一個新類型,而對象是這個 類的實例,類使用class關鍵字創建。類的域和方法被列在一個縮進塊中,一般函數 也可以被叫作方法。 (1)類的變量:甴一個類…

2025 年如何使用 Pycharm、Vscode 進行樹莓派 Respberry Pi Pico 編程開發詳細教程(更新中)

micropython 概述 micropython 官方網站:https://www.micropython.org/ 安裝 Micropython 支持固件 樹莓派 Pico 安裝 Micropython 支持固件 下載地址:https://www.raspberrypi.com/documentation/microcontrollers/ 選擇 MicroPython 下載 RPI_PIC…

flink rocksdb狀態說明

文章目錄 1.默認情況2.flink中的狀態3.RocksDB4.對比情況5.使用6.RocksDB架構7.參考文章8.總結提示:以下主要考慮flink 狀態永久存儲 rocksdb情況,做一些簡單說明 1.默認情況 當flink使用rocksdb存儲狀態時。無論是永久存儲還是臨時存儲都可能會落盤寫文件(如果沒有配置存儲…

安裝SDL和FFmpeg

1、先記錄SDL 這玩意還是有一點講究的 具體步驟: 下載 SDL包: 鏈接:https://www.libsdl.org/release/SDL2-2.0.14.tar.gz 可以用迅雷,下載完之后, 解壓: tar -zxvf SDL2-2.0.14.tar.gz進入安裝目錄 cd …

2022年408真題及答案

2022年計算機408真題 2022年計算機408答案 2022 408真題下載鏈接 2022 408答案下載鏈接

Spring AI聊天模型API:輕松構建智能聊天交互

Spring AI聊天模型API:輕松構建智能聊天交互 前言 在當今數字化時代,智能聊天功能已成為眾多應用程序提升用戶體驗、增強交互性的關鍵要素。Spring AI的聊天模型API為開發者提供了一條便捷通道,能夠將強大的AI驅動的聊天完成功能無縫集成到…