Java中Byte數(shù)組與InputStream相互轉(zhuǎn)換實(shí)現(xiàn)方式
在Java中,byte數(shù)組(byte[])和InputStream之間的相互轉(zhuǎn)換是常見(jiàn)的IO操作。以下是幾種實(shí)現(xiàn)方式:
1. Byte數(shù)組轉(zhuǎn)InputStream
方法1:使用ByteArrayInputStream(最常用)
byte[] byteArray = {72, 101, 108, 108, 111}; // "Hello"的ASCII碼
InputStream inputStream = new ByteArrayInputStream(byteArray);方法2:使用Apache Commons IO
import org.apache.commons.io.input.ClosedInputStream;
import org.apache.commons.io.IOUtils;
byte[] byteArray = {72, 101, 108, 108, 111};
InputStream inputStream = IOUtils.toInputStream(new String(byteArray), "UTF-8");2. InputStream轉(zhuǎn)Byte數(shù)組
方法1:使用ByteArrayOutputStream(標(biāo)準(zhǔn)方式)
public static byte[] inputStreamToByteArray(InputStream inputStream) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
return buffer.toByteArray();
}方法2:使用Java 9+的InputStream.readAllBytes()
// Java 9及以上版本 byte[] byteArray = inputStream.readAllBytes();
方法3:使用Apache Commons IO
import org.apache.commons.io.IOUtils; byte[] byteArray = IOUtils.toByteArray(inputStream);
3. 完整示例
import java.io.*;
import org.apache.commons.io.IOUtils;
public class ByteArrayInputStreamConversion {
public static void main(String[] args) {
try {
// 原始數(shù)據(jù)
String text = "Hello, World!";
byte[] originalBytes = text.getBytes("UTF-8");
// 1. byte[] 轉(zhuǎn) InputStream
System.out.println("\n1. byte[] 轉(zhuǎn) InputStream:");
InputStream inputStream1 = new ByteArrayInputStream(originalBytes);
// 使用流讀取數(shù)據(jù)
int content;
while ((content = inputStream1.read()) != -1) {
System.out.print((char) content);
}
inputStream1.close();
// 2. InputStream 轉(zhuǎn) byte[]
System.out.println("\n\n2. InputStream 轉(zhuǎn) byte[]:");
InputStream inputStream2 = new ByteArrayInputStream(originalBytes);
// 方法1: 使用ByteArrayOutputStream
byte[] bytes1 = inputStreamToByteArray(inputStream2);
System.out.println("方法1結(jié)果: " + new String(bytes1, "UTF-8"));
inputStream2.close();
// 方法2: 使用Java 9+的readAllBytes()
InputStream inputStream3 = new ByteArrayInputStream(originalBytes);
byte[] bytes2 = inputStream3.readAllBytes();
System.out.println("方法2結(jié)果: " + new String(bytes2, "UTF-8"));
inputStream3.close();
// 方法3: 使用Apache Commons IO
InputStream inputStream4 = new ByteArrayInputStream(originalBytes);
byte[] bytes3 = IOUtils.toByteArray(inputStream4);
System.out.println("方法3結(jié)果: " + new String(bytes3, "UTF-8"));
inputStream4.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static byte[] inputStreamToByteArray(InputStream inputStream) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
return buffer.toByteArray();
}
}4. 大文件處理建議
對(duì)于大文件,應(yīng)避免一次性讀取全部?jī)?nèi)容到內(nèi)存:
// 處理大文件的InputStream
public static void processLargeInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[8192]; // 8KB緩沖區(qū)
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
// 處理讀取到的數(shù)據(jù)
processChunk(buffer, bytesRead);
}
}
private static void processChunk(byte[] buffer, int length) {
// 處理數(shù)據(jù)塊的邏輯
}注意事項(xiàng)
- 資源關(guān)閉:使用完InputStream后應(yīng)及時(shí)關(guān)閉,推薦使用try-with-resources
- 字符編碼:byte[]和String轉(zhuǎn)換時(shí)需注意編碼問(wèn)題
- 內(nèi)存限制:大文件應(yīng)分塊處理,避免內(nèi)存溢出
- 性能考慮:緩沖區(qū)大小(如1024, 8192)影響IO性能
選擇哪種方法取決于你的具體需求、Java版本和項(xiàng)目依賴(lài)。對(duì)于現(xiàn)代Java項(xiàng)目,Java 9+的readAllBytes()是最簡(jiǎn)潔的方式;如果需要兼容舊版本或使用額外功能,Apache Commons IO是不錯(cuò)的選擇。
到此這篇關(guān)于Java中Byte數(shù)組與InputStream相互轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)Java Byte數(shù)組與InputStream轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
聊聊spring @Transactional 事務(wù)無(wú)法使用的可能原因
這篇文章主要介紹了spring @Transactional 事務(wù)無(wú)法使用的可能原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Springboot3集成Knife4j的步驟以及使用(最完整版)
這篇文章主要介紹了Springboot3集成Knife4j的步驟以及使用的相關(guān)資料,Knife4j是一種增強(qiáng)Swagger的工具,支持黑色主題和更多配置選項(xiàng),它與swagger-bootstrap-ui相比,提供了更現(xiàn)代的外觀和更多的功能,需要的朋友可以參考下2024-11-11
Java類(lèi)加載之Class對(duì)象到Klass模型詳解
這篇文章主要介紹了Java類(lèi)加載之Class對(duì)象到Klass模型詳解,每一個(gè)Java類(lèi)在JVM中都會(huì)對(duì)應(yīng)創(chuàng)建一個(gè)C++類(lèi)實(shí)例,我們稱(chēng)這個(gè)C++類(lèi)為Klass實(shí)例,Klass實(shí)例里面存儲(chǔ)了java類(lèi)中所描述的方法、字段、屬性等,需要的朋友可以參考下2023-08-08
解析Java中PriorityQueue優(yōu)先級(jí)隊(duì)列結(jié)構(gòu)的源碼及用法
優(yōu)先級(jí)隊(duì)列是一種隊(duì)列結(jié)構(gòu),是0個(gè)或多個(gè)元素的集合,每個(gè)元素都有一個(gè)優(yōu)先權(quán),PriorityQueue被內(nèi)置于JDK中,本文就來(lái)解析Java中PriorityQueue優(yōu)先級(jí)隊(duì)列結(jié)構(gòu)的源碼及用法.2016-05-05
在Java中Collection的一些常用方法總結(jié)
今天給大家?guī)?lái)的知識(shí)是關(guān)于Java的,文章圍繞著Java中Collection的一些常用方法展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
SpringBoot中獲取真實(shí)客戶端IP的終極方案
在日常開(kāi)發(fā)中,獲取客戶端IP看似簡(jiǎn)單,實(shí)則暗藏玄機(jī),今天,小編將徹底揭秘Spring Boot中獲取真實(shí)客戶端IP的正確姿勢(shì),讓你避開(kāi)所有的坑2026-01-01
用IntelliJ IDEA看Java類(lèi)圖的方法(圖文)
這篇文章主要介紹了用IntelliJ IDEA看Java類(lèi)圖的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
Java并發(fā)編程之JUC并發(fā)核心AQS同步隊(duì)列原理剖析
AbstractQueuedSynchronizer 簡(jiǎn)稱(chēng) AQS,可能我們幾乎不會(huì)直接去使用它,但它卻是 JUC 的核心基礎(chǔ)組件,支撐著 java 鎖和同步器的實(shí)現(xiàn),大神 Doug Lea 在設(shè)計(jì) JUC 包時(shí)希望能夠抽象一個(gè)基礎(chǔ)且通用的組件以支撐上層模塊的實(shí)現(xiàn),AQS 應(yīng)運(yùn)而生2021-09-09
Hikari連接池使用SpringBoot配置JMX監(jiān)控實(shí)現(xiàn)
Hikari是Spring Boot默認(rèn)的數(shù)據(jù)庫(kù)連接池。區(qū)別于C3P0直接通過(guò)連接池對(duì)象獲取各項(xiàng)狀態(tài)指標(biāo),Hikari需要通過(guò)JMX來(lái)獲取。本文就詳細(xì)的來(lái)介紹一下,感興趣的可以了解一下2021-07-07

