InputStream类available和read方法读取流数据不全?

1.问题描述

需要将流InputStream转换为byte[]数组,定义的方法如下:

    /**
     * 流转字节数组
     *
     * @param in
     * @return
     * @throws IOException
     */
    public static byte[] streamToByteArray(InputStream in) throws IOException {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        byte[] buffer = new byte[(int) in.available()];
        in.read(buffer);
        in.close();
        return buffer;
    }

在对文件进行转换并保存到本地时,发现文件不完整或内容错误。

2.原因分析

从代码中可以看出,在读物流时调用的是available方法,点击进入其源码发现其返回的是当前流可用长度(估计值),不是流的总长度。而在read方法读取流中数据到buffer中,但读取长度为1至buffer.length,若流结束或遇到异常则返回-1。也就是说当实际文件的长度超过此估计可用长度时也不会继续读,而是结束读取。从而导致读取的流并不完整。

3.解决方案

不能使用available方法,那就需要循环去读取流,直到读取完成,修改的代码如下:

    public static byte[] streamToByteArray(InputStream in) throws IOException {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        byte[] buffer = new byte[4096];
        int n;
        while (-1 != (n = in.read(buffer))) {
            output.write(buffer, 0, n);
        }
        return output.toByteArray();
    }

有时也不能只使用系统自动的方法,容易掉坑。

posted @ 2021-12-19 16:15  钟小嘿  阅读(1051)  评论(0编辑  收藏  举报