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

问题

如何将整个InputStream读入字节数组?


#1 热门回答(919 赞)

你可以使用ApacheCommons IO来处理此类和类似的任务。

IOUtils类型有一个静态方法来读取InputStream并返回byte []

InputStream is;
byte[] bytes = IOUtils.toByteArray(is);

在内部,它创建一个ByteArrayOutputStream并将字节复制到输出,然后调用toByteArray()。它通过复制4KiB块中的字节来处理大文件。


#2 热门回答(390 赞)

你需要从InputStream中读取每个字节并将其写入ByteArrayOutputStream。然后,你可以通过调用toByteArray()来检索基础字节数组;例如

InputStream is = ...
ByteArrayOutputStream buffer = new ByteArrayOutputStream();

int nRead;
byte[] data = new byte[16384];

while ((nRead = is.read(data, 0, data.length)) != -1) {
  buffer.write(data, 0, nRead);
}

buffer.flush();

return buffer.toByteArray();

#3 热门回答(170 赞)

最后,二十年后,有一个简单的解决方案,无需第三方库,多亏了Java 9

InputStream is;
…
byte[] array = is.readAllBytes();

还要注意方便的方法readNBytes(byte [] b,int off,int len)transferTo(OutputStream)解决重复需求。