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

Author Avatar
AF_ 12月 20,2019
  • 使用微信扫码分享

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

总结

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