Java中Byte數(shù)組與InputStream相互轉(zhuǎn)換實(shí)現(xiàn)方式
在Java中,byte數(shù)組(byte[])和InputStream之間的相互轉(zhuǎ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í)需注意編碼問題
- 內(nèi)存限制:大文件應(yīng)分塊處理,避免內(nèi)存溢出
- 性能考慮:緩沖區(qū)大小(如1024, 8192)影響IO性能
選擇哪種方法取決于你的具體需求、Java版本和項(xiàng)目依賴。對(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)文章
idea2020.1設(shè)置多個(gè)spring boot的service啟動(dòng)的實(shí)現(xiàn)
這篇文章主要介紹了idea2020.1設(shè)置多個(gè)spring boot的service啟動(dòng),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Java實(shí)現(xiàn)圖片驗(yàn)證碼具體代碼
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖片驗(yàn)證碼具體代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
使用Springboot對(duì)配置文件中的敏感信息加密
這篇文章主要介紹了使用Springboot對(duì)配置文件中的敏感信息加密方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java實(shí)現(xiàn)從Html文本中提取純文本的方法
今天小編就為大家分享一篇Java實(shí)現(xiàn)從Html文本中提取純文本的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
ThreadPoolExecutor參數(shù)含義及源碼執(zhí)行流程詳解
這篇文章主要為大家介紹了ThreadPoolExecutor參數(shù)含義及源碼執(zhí)行流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Java使用Arthas查看接口方法的執(zhí)行時(shí)間的步驟
在日常的開發(fā)和運(yùn)維工作中,經(jīng)常需要監(jiān)控接口方法的執(zhí)行時(shí)間,以便排查性能問題或優(yōu)化代碼,Arthas 是一款強(qiáng)大的 Java 診斷工具,可以幫助我們輕松地查看接口方法的執(zhí)行時(shí)間,而無需修改代碼或重啟應(yīng)用,本文將詳細(xì)介紹如何使用 Arthas 來查看接口方法的執(zhí)行時(shí)間2025-05-05
Java如何使用ReentrantLock實(shí)現(xiàn)長(zhǎng)輪詢
這篇文章主要介紹了如何使用ReentrantLock實(shí)現(xiàn)長(zhǎng)輪詢,對(duì)ReentrantLock感興趣的同學(xué),可以參考下2021-04-04
Java中ArrayList與LinkedList的使用及區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于Java中ArrayList與LinkedList的使用及區(qū)別的相關(guān)資料,ArrayList和LinkedList都是實(shí)現(xiàn)了List接口的容器類,用于存儲(chǔ)一系列的對(duì)象引用,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11
Spring Boot結(jié)合IDEA自帶Maven插件如何快速切換profile
IDEA是目前 Java 開發(fā)者中使用最多的開發(fā)工具,它有著簡(jiǎn)約的設(shè)計(jì)風(fēng)格,強(qiáng)大的集成工具,便利的快捷鍵,這篇文章主要介紹了Spring Boot結(jié)合IDEA自帶Maven插件快速切換profile,需要的朋友可以參考下2023-03-03

