📜  如何在Java中将 InputStream 转换为字节数组?

📅  最后修改于: 2022-05-13 01:55:09.698000             🧑  作者: Mango

如何在Java中将 InputStream 转换为字节数组?

在Java,输入流指的是字节形式的有序数据流。这种数据流可以来自各种资源,例如文件、网络程序、输入设备等。为了读取这些数据,我们在Java IO API 中有一个Java InputStream类。有多种方法可以将此输入流转换为字节数组(或 byte[]),可在需要时使用。我们现在来看看一些方法来做同样的事情,如下所示:

方法:

  1. 使用 read(byte[]) 或 readAllBytes()
  2. 使用 ByteArrayOutputStream 类
  3. 使用 ByteStreams 实用程序类
  4. 使用 Apache Commons IO 库

现在我们将详细讨论每个方法,以便通过干净的Java程序理解相同的实现,如下所示:

方法 1:使用 read(byte[]) 或 readAllBytes()

在InputStream类中,我们有一个read()方法,可以传入一个字节数组作为参数,以字节数组的形式获取输入流数据。但是这种方法有一个缺点,它最多只能读取作为参数传递的数组大小的数据。只有当我们事先知道传入数据的大小时,它才能很好地工作。该方法返回一个 int 值,该值等于读入数组的字节数,如果到达流末尾,则返回 -1。



句法:

声明读取(字节[])

public int read​(byte[] byteArray)
throws IOException

为了克服必须事先知道输入大小的缺点,我们从Java 9 开始提供了另一种称为readAllBytes() 的方法。该方法可以读取输入流中的所有可用字节。该方法在将输入流转换为字节数组方面更快、更有效。

语法: readAllBytes()

public byte[] readAllBytes()
throws IOException

例子

Java
// Java Program to Convert InputStream to Byte Array
// Using read(byte[]) or readAllBytes()
  
// Importing required classes
import java.io.*;
import java.nio.charset.StandardCharsets;
  
// Main class
class GFG {
  
    // Main driver method
    public static void main(String[] args)
    {
        // Creating a Input Stream here
        // Usually it comes from files, programs
        InputStream inputStream = new ByteArrayInputStream(
            "GeeksForGeeks".getBytes(
                StandardCharsets.UTF_8));
  
        // Taking the InputStream data into a byte array
        byte[] byteArray = null;
  
        // Try block to check for exceptions
        try {
            byteArray = inputStream.readAllBytes();
        }
  
        // Catch block to handle the exceptions
        catch (IOException e) {
  
            // Print and dispal ythe exceptions
            System.out.println(e);
        }
  
        // Iterating over using for each loop
        for (byte b : byteArray)
  
            // Printing the content of byte array
            System.out.print((char)b + " ");
    }
}


Java
// Java Program to Convert InputStream to Byte Array
// Using ByteArrayOutputStream Class
  
// Importing required classes
import java.io.*;
import java.nio.charset.StandardCharsets;
  
// Main class
class GFG {
  
    // Main driver method
    public static void main(String[] args)
    {
        // Creating a Input Stream here (usually it comes
        // from files, programs, etc.)
        InputStream inputStream = new ByteArrayInputStream(
            "GeeksForGeeks".getBytes(
                StandardCharsets.UTF_8));
  
        // Taking the InputStream data into a byte array
        // output stream
  
        // Buffer size taken to be 1000 say.
        byte[] buffer = new byte[1000];
  
        // Creating an object of ByteArrayOutputStream class
        ByteArrayOutputStream byteArrayOutputStream
            = new ByteArrayOutputStream();
  
        // Try block to check for exceptions
        try {
            int temp;
  
            while ((temp = inputStream.read(buffer))
                   != -1) {
                byteArrayOutputStream.write(buffer, 0,
                                            temp);
            }
        }
  
        // Catch block to handle the exceptions
        catch (IOException e) {
  
            // Display the exception/s on the console
            System.out.println(e);
        }
  
        // Mow converting byte array output stream to byte
        // array
        byte[] byteArray
            = byteArrayOutputStream.toByteArray();
  
        // Iterating over using for each loop
        for (byte b : byteArray)
  
            // Printing the content of byte array
            System.out.print((char)b + " ");
    }
}


Java
// Java Program to Convert InputStream to Byte Array
// Using ByteArrayOutputStream Class
  
// Importing required classes, here additionally
// We are importing from Guava Library
import com.google.common.io.ByteStreams;
import java.io.*;
import java.nio.charset.StandardCharsets;
  
// Main class
class GFG {
  
    // Main driver method
    public static void main(String[] args)
    {
        // Creating a Input Stream here
        // usually it comes from files, programs
        InputStream inputStream = new ByteArrayInputStream(
            "GeeksForGeeks".getBytes(
                StandardCharsets.UTF_8));
  
        // Taking the InputStream data into a byte array
        // using ByteStreams
        byte[] byteArray = null;
  
        // Try block to check for exceptions
        try {
            byteArray
                = ByteStreams.toByteArray(inputStream);
        }
  
        // Catch block to handle the exceptions
        catch (IOException e) {
  
            // Display the exceptions on the console window
            System.out.println(e);
        }
  
        // Iterating over using for each loop
        for (byte b : byteArray)
  
            // Printing the content of byte array
            System.out.print((char)b + " ");
    }
}


输出
G e e k s F o r G e e k s 

示例 2:使用 ByteArrayOutputStream 类

这是将输入流数据转换为字节数组的间接方法。这里我们将使用 ByteArrayOutputStream 类的对象作为缓冲区。为此,我们从 InputStream 类中读取每个字节并将其写入 ByteArrayOutputStream 类。稍后我们调用 toByteArray() 以字节数组的形式返回输出流。



例子

Java

// Java Program to Convert InputStream to Byte Array
// Using ByteArrayOutputStream Class
  
// Importing required classes
import java.io.*;
import java.nio.charset.StandardCharsets;
  
// Main class
class GFG {
  
    // Main driver method
    public static void main(String[] args)
    {
        // Creating a Input Stream here (usually it comes
        // from files, programs, etc.)
        InputStream inputStream = new ByteArrayInputStream(
            "GeeksForGeeks".getBytes(
                StandardCharsets.UTF_8));
  
        // Taking the InputStream data into a byte array
        // output stream
  
        // Buffer size taken to be 1000 say.
        byte[] buffer = new byte[1000];
  
        // Creating an object of ByteArrayOutputStream class
        ByteArrayOutputStream byteArrayOutputStream
            = new ByteArrayOutputStream();
  
        // Try block to check for exceptions
        try {
            int temp;
  
            while ((temp = inputStream.read(buffer))
                   != -1) {
                byteArrayOutputStream.write(buffer, 0,
                                            temp);
            }
        }
  
        // Catch block to handle the exceptions
        catch (IOException e) {
  
            // Display the exception/s on the console
            System.out.println(e);
        }
  
        // Mow converting byte array output stream to byte
        // array
        byte[] byteArray
            = byteArrayOutputStream.toByteArray();
  
        // Iterating over using for each loop
        for (byte b : byteArray)
  
            // Printing the content of byte array
            System.out.print((char)b + " ");
    }
}
输出
G e e k s F o r G e e k s 

方法 3:使用 ByteStreams 实用程序类

Guava 库中的 ByteStreams 实用程序类具有将输入流转换为字节数组的直接方法。

谷歌番石榴是一个开源的(分散的软件开发模式,鼓励开放协作)设置为Java公用库,主要由谷歌工程师开发。它有助于减少编码错误。它提供了用于集合、缓存、原语支持、并发、通用注释、字符串处理、I/O 和验证的实用方法。

例子

Java

// Java Program to Convert InputStream to Byte Array
// Using ByteArrayOutputStream Class
  
// Importing required classes, here additionally
// We are importing from Guava Library
import com.google.common.io.ByteStreams;
import java.io.*;
import java.nio.charset.StandardCharsets;
  
// Main class
class GFG {
  
    // Main driver method
    public static void main(String[] args)
    {
        // Creating a Input Stream here
        // usually it comes from files, programs
        InputStream inputStream = new ByteArrayInputStream(
            "GeeksForGeeks".getBytes(
                StandardCharsets.UTF_8));
  
        // Taking the InputStream data into a byte array
        // using ByteStreams
        byte[] byteArray = null;
  
        // Try block to check for exceptions
        try {
            byteArray
                = ByteStreams.toByteArray(inputStream);
        }
  
        // Catch block to handle the exceptions
        catch (IOException e) {
  
            // Display the exceptions on the console window
            System.out.println(e);
        }
  
        // Iterating over using for each loop
        for (byte b : byteArray)
  
            // Printing the content of byte array
            System.out.print((char)b + " ");
    }
}

方法 4:使用 Apache Commons IO 库

此方法与使用 ByteStreams 类非常相似。这里我们使用 IOUtils 类,它有一个类似的方法,同名 toByteArray() 将输入流数据作为字节数组返回。用法相同,我们只需要使用 import org.apache.commons.io.IOUtils而不是 Guava Library 的 ByteStreams。

句法:

byte[] byteArray = IOUtils.toByteArray(inputStream);