Java 将InputStream转换为Byte数组的方法
在Java开发过程中,我们经常需要处理各种输入输出流。其中,将InputStream对象转换为Byte数组是一个常见的操作。本文将详细介绍几种实现这种转换的方法。
方法一:使用ByteArrayOutputStream字节数组输出流
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class InputStreamToByteArrayMethod1 {
public static byte[] inputStreamToByteArray(InputStream inputStream) throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, length);
}
byteArrayOutputStream.close();
return byteArrayOutputStream.toByteArray();
}
public static void main(String[] args) {
InputStream inputStream = InputStreamToByteArrayMethod1.class.getResourceAsStream("example.txt");
try {
byte[] byteArray = inputStreamToByteArray(inputStream);
System.out.println(new String(byteArray));
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
This is an example file.
使用ByteArrayOutputStream字节数组输出流的方法比较简单。我们创建一个ByteArrayOutputStream对象,并使用一个缓冲区读取输入流。每次读取时,将数据写入字节数组输出流。最后,通过调用toByteArray()
方法,将ByteArrayOutputStream对象转换为字节数组。
方法二:使用Apache Commons IO库
除了自己实现字节数组输出流的方法,我们还可以使用Apache Commons IO库中提供的工具类快速完成这个任务。
首先,我们需要将以下依赖项添加到我们的项目中:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
然后,我们可以使用IOUtils
类中的toByteArray()
方法将InputStream转换为字节数组。
import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;
public class InputStreamToByteArrayMethod2 {
public static byte[] inputStreamToByteArray(InputStream inputStream) throws IOException {
return IOUtils.toByteArray(inputStream);
}
public static void main(String[] args) {
InputStream inputStream = InputStreamToByteArrayMethod2.class.getResourceAsStream("example.txt");
try {
byte[] byteArray = inputStreamToByteArray(inputStream);
System.out.println(new String(byteArray));
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
This is an example file.
方法二使用了Apache Commons IO库中的toByteArray()
方法,该方法使用了和方法一相同的原理。但是,使用这种方法可以减少我们自己编写代码的工作量。
方法三:使用Java NIO
Java NIO(New IO)是在Java 1.4版本中引入的一组新的输入输出API。它提供了更快速和更灵活的I/O操作。在Java NIO中,我们可以使用ByteBuffer
类和Channels
类进行InputStream到Byte数组的转换。
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
public class InputStreamToByteArrayMethod3 {
public static byte[] inputStreamToByteArray(InputStream inputStream) throws IOException {
ReadableByteChannel channel = Channels.newChannel(inputStream);
ByteBuffer buffer = ByteBuffer.allocate(1024);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
while (channel.read(buffer) != -1) {
buffer.flip();
while (buffer.hasRemaining()) {
byteArrayOutputStream.write(buffer.get());
}
buffer.clear();
}
channel.close();
byteArrayOutputStream.close();
return byteArrayOutputStream.toByteArray();
}
public static void main(String[] args) {
InputStream inputStream = InputStreamToByteArrayMethod3.class.getResourceAsStream("example.txt");
try {
byte[] byteArray = inputStreamToByteArray(inputStream);
System.out.println(new String(byteArray));
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
This is an example file.
方法三使用了Java NIO的一些特性,通过Channels
类创建一个ReadableByteChannel
对象,然后将输入流传递给该通道。接着,我们创建一个ByteBuffer
对象和一个字节数组输出流,循环读取通道中的数据并将其写入字节数组输出流。最后,关闭通道和字节数组输出流,并通过调用toByteArray()
方法,将字节数组输出流转换为字节数组。
总结
本文介绍了几种将InputStream转换为Byte数组的方法。使用ByteArrayOutputStream字节数组输出流的方法是最简单的,但也可以使用Apache Commons IO库提供的工具类和Java NIO实现类似的功能。根据实际需求和项目特点,我们可以选择适合的方法来完成这个任务。