Java中Byte数组与InputStream相互转换实现方式
作者:ecexy78041
在Java中,byte数组(byte[])和InputStream之间的相互转换是常见的IO操作,下面通过本文给大家分享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转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!