Java中Byte數(shù)組與InputStream相互轉換實現(xiàn)方式
在Java中,byte數(shù)組(byte[])和InputStream之間的相互轉換是常見的IO操作。以下是幾種實現(xiàn)方式:
1. Byte數(shù)組轉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轉Byte數(shù)組
方法1:使用ByteArrayOutputStream(標準方式)
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ù)據
String text = "Hello, World!";
byte[] originalBytes = text.getBytes("UTF-8");
// 1. byte[] 轉 InputStream
System.out.println("\n1. byte[] 轉 InputStream:");
InputStream inputStream1 = new ByteArrayInputStream(originalBytes);
// 使用流讀取數(shù)據
int content;
while ((content = inputStream1.read()) != -1) {
System.out.print((char) content);
}
inputStream1.close();
// 2. InputStream 轉 byte[]
System.out.println("\n\n2. InputStream 轉 byte[]:");
InputStream inputStream2 = new ByteArrayInputStream(originalBytes);
// 方法1: 使用ByteArrayOutputStream
byte[] bytes1 = inputStreamToByteArray(inputStream2);
System.out.println("方法1結果: " + new String(bytes1, "UTF-8"));
inputStream2.close();
// 方法2: 使用Java 9+的readAllBytes()
InputStream inputStream3 = new ByteArrayInputStream(originalBytes);
byte[] bytes2 = inputStream3.readAllBytes();
System.out.println("方法2結果: " + 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結果: " + 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. 大文件處理建議
對于大文件,應避免一次性讀取全部內容到內存:
// 處理大文件的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ù)據
processChunk(buffer, bytesRead);
}
}
private static void processChunk(byte[] buffer, int length) {
// 處理數(shù)據塊的邏輯
}注意事項
- 資源關閉:使用完InputStream后應及時關閉,推薦使用try-with-resources
- 字符編碼:byte[]和String轉換時需注意編碼問題
- 內存限制:大文件應分塊處理,避免內存溢出
- 性能考慮:緩沖區(qū)大小(如1024, 8192)影響IO性能
選擇哪種方法取決于你的具體需求、Java版本和項目依賴。對于現(xiàn)代Java項目,Java 9+的readAllBytes()是最簡潔的方式;如果需要兼容舊版本或使用額外功能,Apache Commons IO是不錯的選擇。
到此這篇關于Java中Byte數(shù)組與InputStream相互轉換的文章就介紹到這了,更多相關Java Byte數(shù)組與InputStream轉換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
聊聊spring @Transactional 事務無法使用的可能原因
這篇文章主要介紹了spring @Transactional 事務無法使用的可能原因,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Springboot3集成Knife4j的步驟以及使用(最完整版)
這篇文章主要介紹了Springboot3集成Knife4j的步驟以及使用的相關資料,Knife4j是一種增強Swagger的工具,支持黑色主題和更多配置選項,它與swagger-bootstrap-ui相比,提供了更現(xiàn)代的外觀和更多的功能,需要的朋友可以參考下2024-11-11
解析Java中PriorityQueue優(yōu)先級隊列結構的源碼及用法
優(yōu)先級隊列是一種隊列結構,是0個或多個元素的集合,每個元素都有一個優(yōu)先權,PriorityQueue被內置于JDK中,本文就來解析Java中PriorityQueue優(yōu)先級隊列結構的源碼及用法.2016-05-05
Java并發(fā)編程之JUC并發(fā)核心AQS同步隊列原理剖析
AbstractQueuedSynchronizer 簡稱 AQS,可能我們幾乎不會直接去使用它,但它卻是 JUC 的核心基礎組件,支撐著 java 鎖和同步器的實現(xiàn),大神 Doug Lea 在設計 JUC 包時希望能夠抽象一個基礎且通用的組件以支撐上層模塊的實現(xiàn),AQS 應運而生2021-09-09
Hikari連接池使用SpringBoot配置JMX監(jiān)控實現(xiàn)
Hikari是Spring Boot默認的數(shù)據庫連接池。區(qū)別于C3P0直接通過連接池對象獲取各項狀態(tài)指標,Hikari需要通過JMX來獲取。本文就詳細的來介紹一下,感興趣的可以了解一下2021-07-07

