Java InputStream 转 byte

在 Java 中,InputStream 是一个抽象类,用于表示输入字节流。有时候我们需要把 InputStream 转换为 byte 数组进行处理,本文将介绍如何将 InputStream 转换为 byte 数组的几种方法,并提供代码示例进行说明。

方法一:使用 ByteArrayOutputStream

ByteArrayOutputStream 是一个实现了输出流接口的类,它可以将数据写入到内部的字节数组中。我们可以利用这个特性将 InputStream 的数据写入 ByteArrayOutputStream,然后获取字节数组。

首先,我们需要创建一个 ByteArrayOutputStream 对象和一个缓冲区 byte 数组。然后使用一个 while 循环从 InputStream 中读取数据,并将数据写入 ByteArrayOutputStream 中。最后,通过调用 ByteArrayOutputStream 的 toByteArray() 方法,我们可以获得转换后的 byte 数组。

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class InputStreamToByteArrayExample {

    public static byte[] convert(InputStream inputStream) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            byteArrayOutputStream.write(buffer, 0, bytesRead);
        }
        return byteArrayOutputStream.toByteArray();
    }

    public static void main(String[] args) {
        // 使用示例
        try {
            InputStream inputStream = new FileInputStream("path/to/input/file");
            byte[] bytes = convert(inputStream);
            System.out.println(Arrays.toString(bytes));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用 ByteArrayOutputStream 转换 InputStream 为 byte 数组的方法简单易懂,适用于大多数情况。然而,如果 InputStream 的数据量非常大,可能会导致内存溢出。在这种情况下,我们可以使用另一种方法。

方法二:使用 BufferedInputStream

BufferedInputStream 是 InputStream 的子类,它提供了缓冲区功能,能够提高读取数据的效率。我们可以借助 BufferedInputStream 和内部的缓冲区将数据一次性转换为 byte 数组。

与方法一不同的是,我们需要创建一个 BufferedInputStream 对象,并使用一个 byte 数组作为缓冲区。然后,通过调用 BufferedInputStream 的 read() 方法将数据读取到缓冲区中。最后,通过调用 BufferedInputStream 的 available() 方法获取缓冲区中的字节数,从而创建一个恰好大小的 byte 数组。

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class InputStreamToByteArrayExample {

    public static byte[] convert(InputStream inputStream) throws IOException {
        BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        byte[] buffer = new byte[bufferedInputStream.available()];
        bufferedInputStream.read(buffer);
        return buffer;
    }

    public static void main(String[] args) {
        // 使用示例
        try {
            InputStream inputStream = new FileInputStream("path/to/input/file");
            byte[] bytes = convert(inputStream);
            System.out.println(Arrays.toString(bytes));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

通过使用 BufferedInputStream,我们可以更高效地将 InputStream 转换为 byte 数组,适用于大数据量的情况。

方法三:使用 Apache Commons IO

如果你使用 Apache Commons IO 库,可以更加方便地将 InputStream 转换为 byte 数组。Apache Commons IO 提供了 IOUtils 类,其中有一个 toByteArray() 方法可以将 InputStream 转换为 byte 数组。

首先,我们需要导入 Apache Commons IO 的依赖。然后,通过调用 IOUtils.toByteArray() 方法即可将 InputStream 转换为 byte 数组。

import org.apache.commons.io.IOUtils;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class InputStreamToByteArrayExample {

    public static byte[] convert(InputStream inputStream) throws IOException {
        return IOUtils.toByteArray(inputStream);
    }

    public static void main(String[] args) {
        // 使用示例
        try {
            InputStream inputStream = new FileInputStream("path/to/input/file");
            byte[] bytes = convert(inputStream);
            System.out.println(Arrays.toString(bytes));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用 Apache Commons IO,我们可以通过一行代码将 InputStream 转换为 byte 数组,非常方便。

总结

本文介绍了三种将 Java InputStream 转换为 byte 数组的方法:使用 ByteArrayOutputStream、使用 BufferedInputStream 和使用 Apache Commons IO。这些方法分别适用于不同的场景,你可以根据自