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转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • idea2020.1设置多个spring boot的service启动的实现

    idea2020.1设置多个spring boot的service启动的实现

    这篇文章主要介绍了idea2020.1设置多个spring boot的service启动,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java实现图片验证码具体代码

    Java实现图片验证码具体代码

    这篇文章主要为大家详细介绍了Java实现图片验证码具体代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 使用Springboot对配置文件中的敏感信息加密

    使用Springboot对配置文件中的敏感信息加密

    这篇文章主要介绍了使用Springboot对配置文件中的敏感信息加密方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 详解SpringBean基于XML的装配

    详解SpringBean基于XML的装配

    Bean的装配可以理解为依赖关系注入,Bean的装配方式也就是Bean 的依赖注入方式.Spring容器支持多种形式的Bean的装配方式,如基于XML的Bean装配,基于Annotation的Bean装配和自动装配等.本文就带大家了解SpringBean基于XML的装配,需要的朋友可以参考下
    2021-05-05
  • Java实现从Html文本中提取纯文本的方法

    Java实现从Html文本中提取纯文本的方法

    今天小编就为大家分享一篇Java实现从Html文本中提取纯文本的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • ThreadPoolExecutor参数含义及源码执行流程详解

    ThreadPoolExecutor参数含义及源码执行流程详解

    这篇文章主要为大家介绍了ThreadPoolExecutor参数含义及源码执行流程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Java使用Arthas查看接口方法的执行时间的步骤

    Java使用Arthas查看接口方法的执行时间的步骤

    在日常的开发和运维工作中,经常需要监控接口方法的执行时间,以便排查性能问题或优化代码,Arthas 是一款强大的 Java 诊断工具,可以帮助我们轻松地查看接口方法的执行时间,而无需修改代码或重启应用,本文将详细介绍如何使用 Arthas 来查看接口方法的执行时间
    2025-05-05
  • Java如何使用ReentrantLock实现长轮询

    Java如何使用ReentrantLock实现长轮询

    这篇文章主要介绍了如何使用ReentrantLock实现长轮询,对ReentrantLock感兴趣的同学,可以参考下
    2021-04-04
  • Java中ArrayList与LinkedList的使用及区别详解

    Java中ArrayList与LinkedList的使用及区别详解

    这篇文章主要给大家介绍了关于Java中ArrayList与LinkedList的使用及区别的相关资料,ArrayList和LinkedList都是实现了List接口的容器类,用于存储一系列的对象引用,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-11-11
  • Spring Boot结合IDEA自带Maven插件如何快速切换profile

    Spring Boot结合IDEA自带Maven插件如何快速切换profile

    IDEA是目前 Java 开发者中使用最多的开发工具,它有着简约的设计风格,强大的集成工具,便利的快捷键,这篇文章主要介绍了Spring Boot结合IDEA自带Maven插件快速切换profile,需要的朋友可以参考下
    2023-03-03

最新评论