Java中Byte数组与InputStream相互转换实现方式

 更新时间:2025年09月02日 09:33:20   作者: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转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 聊聊spring @Transactional 事务无法使用的可能原因

    聊聊spring @Transactional 事务无法使用的可能原因

    这篇文章主要介绍了spring @Transactional 事务无法使用的可能原因,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 使用itextpdf解决PDF合并的问题

    使用itextpdf解决PDF合并的问题

    这篇文章主要介绍了使用itextpdf解决PDF合并的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Springboot3集成Knife4j的步骤以及使用(最完整版)

    Springboot3集成Knife4j的步骤以及使用(最完整版)

    这篇文章主要介绍了Springboot3集成Knife4j的步骤以及使用的相关资料,Knife4j是一种增强Swagger的工具,支持黑色主题和更多配置选项,它与swagger-bootstrap-ui相比,提供了更现代的外观和更多的功能,需要的朋友可以参考下
    2024-11-11
  • Java类加载之Class对象到Klass模型详解

    Java类加载之Class对象到Klass模型详解

    这篇文章主要介绍了Java类加载之Class对象到Klass模型详解,每一个Java类在JVM中都会对应创建一个C++类实例,我们称这个C++类为Klass实例,Klass实例里面存储了java类中所描述的方法、字段、属性等,需要的朋友可以参考下
    2023-08-08
  • 解析Java中PriorityQueue优先级队列结构的源码及用法

    解析Java中PriorityQueue优先级队列结构的源码及用法

    优先级队列是一种队列结构,是0个或多个元素的集合,每个元素都有一个优先权,PriorityQueue被内置于JDK中,本文就来解析Java中PriorityQueue优先级队列结构的源码及用法.
    2016-05-05
  • 在Java中Collection的一些常用方法总结

    在Java中Collection的一些常用方法总结

    今天给大家带来的知识是关于Java的,文章围绕着Java中Collection的一些常用方法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • SpringBoot中获取真实客户端IP的终极方案

    SpringBoot中获取真实客户端IP的终极方案

    在日常开发中,获取客户端IP看似简单,实则暗藏玄机,今天,小编将彻底揭秘Spring Boot中获取真实客户端IP的正确姿势,让你避开所有的坑
    2026-01-01
  • 用IntelliJ IDEA看Java类图的方法(图文)

    用IntelliJ IDEA看Java类图的方法(图文)

    这篇文章主要介绍了用IntelliJ IDEA看Java类图的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Java并发编程之JUC并发核心AQS同步队列原理剖析

    Java并发编程之JUC并发核心AQS同步队列原理剖析

    AbstractQueuedSynchronizer 简称 AQS,可能我们几乎不会直接去使用它,但它却是 JUC 的核心基础组件,支撑着 java 锁和同步器的实现,大神 Doug Lea 在设计 JUC 包时希望能够抽象一个基础且通用的组件以支撑上层模块的实现,AQS 应运而生
    2021-09-09
  • Hikari连接池使用SpringBoot配置JMX监控实现

    Hikari连接池使用SpringBoot配置JMX监控实现

    Hikari是Spring Boot默认的数据库连接池。区别于C3P0直接通过连接池对象获取各项状态指标,Hikari需要通过JMX来获取。本文就详细的来介绍一下,感兴趣的可以了解一下
    2021-07-07

最新评论