Java 基础教程

Java 面向对象

Java 高级教程

Java 笔记

java InputStream 输入流转换成 byte[] 数组的多种方式

Java 笔记 Java 笔记


在 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();