在 java 中,InputStream 输入流对象转换成 byte[] 数组有多种方式,如 apache 的 commons-io 包提供了封装好的静态方法,google 的 Guava 包也提供了现成的方法,此外也可以基于 JDK 自己去编写。
IOUtils.toByteArray(commons-io 库)
apache 的 commons-io 包提供了封装好的静态方法 IOUtils.toByteArray
。
public static byte[] toByteArray(InputStream input) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
copy(input, output);
return output.toByteArray();
}
ByteStreams.toByteArray(google guava)
google 的 guava 库也参照 commons-io 的实现方式,提供了静态方法 ByteStreams.toByteArray
。
public static byte[] toByteArray(InputStream in) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream(Math.max(32, in.available()));
copy(in, out);
return out.toByteArray();
}
StreamUtils.copyToByteArray(spring-core)
如果使用 Spring 框架,其中 spring-core 的 3.2.2 版本开始,增加了 StreamUtils 流工具类,其中也提供了静态方法 StreamUtils.copyToByteArray
。
public static byte[] copyToByteArray(@Nullable InputStream in) throws IOException {
if (in == null) {
return new byte[0];
}
ByteArrayOutputStream out = new ByteArrayOutputStream(BUFFER_SIZE);
copy(in, out);
return out.toByteArray();
}
inputStream.readAllBytes(Java 9+)
从 java 9 及以后的版本,不需要依赖第三方库,直接提供了 InputStream 对象的 readAllBytes
方法。
public byte[] readAllBytes() throws IOException {
byte[] buf = new byte[DEFAULT_BUFFER_SIZE];
int capacity = buf.length;
int nread = 0;
int n;
for (;;) {
// read to EOF which may read more or less than initial buffer size
while ((n = read(buf, nread, capacity - nread)) > 0)
nread += n;
// if the last call to read returned -1, then we're done
if (n < 0)
break;
// need to allocate a larger buffer
if (capacity <= MAX_BUFFER_SIZE - capacity) {
capacity = capacity << 1;
} else {
if (capacity == MAX_BUFFER_SIZE)
throw new OutOfMemoryError("Required array size too large");
capacity = MAX_BUFFER_SIZE;
}
buf = Arrays.copyOf(buf, capacity);
}
return (capacity == nread) ? buf : Arrays.copyOf(buf, nread);
}
自己实现(Java 9 以下)
下面给出基于 jdk 实现的转换逻辑,具体如下:
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);
}
return buffer.toByteArray();