12. InputStream重复使用小技巧

一灰灰blogJavaIOJavaInputStream约 239 字小于 1 分钟

在日常的编码中,有时会遇到,需要重复获取InputStream中的数据的需求;然后一般的流,只能读一次,读完就没了;那么如果我希望有一个可以重复读取数据的InputStream,可以怎么操作?

/**
 * 转换为字节数组输入流,可以重复消费流中数据
 *
 * @param inputStream
 * @return
 * @throws IOException
 */
public static ByteArrayInputStream toByteArrayInputStream(InputStream inputStream) throws IOException {
    if (inputStream instanceof ByteArrayInputStream) {
        return (ByteArrayInputStream) inputStream;
    }

    try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
        BufferedInputStream br = new BufferedInputStream(inputStream);
        byte[] b = new byte[1024];
        for (int c; (c = br.read(b)) != -1; ) {
            bos.write(b, 0, c);
        }
        // 主动告知回收
        b = null;
        br.close();
        inputStream.close();
        return new ByteArrayInputStream(bos.toByteArray());
    }
}

实现方式基本就是将InputStream中的数据读取,写入到一个临时的输出流,然后再封装为ByteArrayInputStream即可

当我们使用时,如果需要重复消费流中数据,手动调用java.io.ByteArrayInputStream#reset

Loading...