java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java Byte数组与InputStream转换

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) {
    // 处理数据块的逻辑
}

注意事项

选择哪种方法取决于你的具体需求、Java版本和项目依赖。对于现代Java项目,Java 9+的readAllBytes()是最简洁的方式;如果需要兼容旧版本或使用额外功能,Apache Commons IO是不错的选择。

到此这篇关于Java中Byte数组与InputStream相互转换的文章就介绍到这了,更多相关Java Byte数组与InputStream转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文