如何在Java中将 InputStream 转换为字节数组?
在Java,输入流指的是字节形式的有序数据流。这种数据流可以来自各种资源,例如文件、网络程序、输入设备等。为了读取这些数据,我们在Java IO API 中有一个Java InputStream类。有多种方法可以将此输入流转换为字节数组(或 byte[]),可在需要时使用。我们现在来看看一些方法来做同样的事情,如下所示:
方法:
- 使用 read(byte[]) 或 readAllBytes()
- 使用 ByteArrayOutputStream 类
- 使用 ByteStreams 实用程序类
- 使用 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);
Note: However, this method often needs the addition of dependency to the editor.