Java中Byte数组与InputStream相互转换实现方式
在Java中,byte数组(byte[])和InputStream之间的相互转换是常见的IO操作。以下是几种实现方式:
1. Byte数组转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数组
方法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 {
// 原始数据
String text = "Hello, World!";
byte[] originalBytes = text.getBytes("UTF-8");
// 1. byte[] 转 InputStream
System.out.println("\n1. byte[] 转 InputStream:");
InputStream inputStream1 = new ByteArrayInputStream(originalBytes);
// 使用流读取数据
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缓冲区
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
// 处理读取到的数据
processChunk(buffer, bytesRead);
}
}
private static void processChunk(byte[] buffer, int length) {
// 处理数据块的逻辑
}注意事项
- 资源关闭:使用完InputStream后应及时关闭,推荐使用try-with-resources
- 字符编码:byte[]和String转换时需注意编码问题
- 内存限制:大文件应分块处理,避免内存溢出
- 性能考虑:缓冲区大小(如1024, 8192)影响IO性能
选择哪种方法取决于你的具体需求、Java版本和项目依赖。对于现代Java项目,Java 9+的readAllBytes()是最简洁的方式;如果需要兼容旧版本或使用额外功能,Apache Commons IO是不错的选择。
到此这篇关于Java中Byte数组与InputStream相互转换的文章就介绍到这了,更多相关Java Byte数组与InputStream转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
idea2020.1设置多个spring boot的service启动的实现
这篇文章主要介绍了idea2020.1设置多个spring boot的service启动,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-06-06
ThreadPoolExecutor参数含义及源码执行流程详解
这篇文章主要为大家介绍了ThreadPoolExecutor参数含义及源码执行流程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-11-11
Java中ArrayList与LinkedList的使用及区别详解
这篇文章主要给大家介绍了关于Java中ArrayList与LinkedList的使用及区别的相关资料,ArrayList和LinkedList都是实现了List接口的容器类,用于存储一系列的对象引用,文中通过代码介绍的非常详细,需要的朋友可以参考下2024-11-11
Spring Boot结合IDEA自带Maven插件如何快速切换profile
IDEA是目前 Java 开发者中使用最多的开发工具,它有着简约的设计风格,强大的集成工具,便利的快捷键,这篇文章主要介绍了Spring Boot结合IDEA自带Maven插件快速切换profile,需要的朋友可以参考下2023-03-03


最新评论