侧边栏壁纸
博主头像
故黎

tt--

  • 累计撰写 29 篇文章
  • 累计创建 5 个标签
  • 累计收到 7 条评论
标签搜索

InputStream类available方法无法获取完整数据流

故黎
2019-12-20 / 0 评论 / 0 点赞 / 1,872 阅读 / 588 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-12-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

在使用feign调用下载文件接口时,由于对这块东西不是很熟,所以从网上copy了一段代码稍作修改直接使用了,测试下载都正常。后面发现了问题,文件下载不全,而且文件大小很随机,百思不得其解。

问题解决

  • 文件下载不全应该是将网络流inputStream转换为byte[]数组是没有读取完整。网上copy的转换的代码如下:
    	byte[] b = new byte[inputStream.available()];
    
  • 那么这个inputStream.available()方法到底有什么用呢,查看了JDK8的API,描述如下:
    available
    可以看出,available方法返回估计的当前流可用长度,不是流的总长度,而且是估计值。
  • 解决方案就是使用read方法循环读取完整数据流:
    private byte[] toByteArray(InputStream input) throws IOException {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        byte[] buffer = new byte[4096];
        int n = 0;
        while (-1 != (n = input.read(buffer))) {
            output.write(buffer, 0, n);
        }
        return output.toByteArray();
    }
    

总结

  • 以后遇到这种问题不能犯懒,一定严格测试搞清楚缘由再使用 -_-
0

评论区