在使用feign调用下载文件接口时,由于对这块东西不是很熟,所以从网上copy了一段代码稍作修改直接使用了,测试下载都正常。后面发现了问题,文件下载不全,而且文件大小很随机,百思不得其解。
问题解决
- 文件下载不全应该是将网络流inputStream转换为byte[]数组是没有读取完整。网上copy的转换的代码如下:
byte[] b = new byte[inputStream.available()];
- 那么这个inputStream.available()方法到底有什么用呢,查看了JDK8的API,描述如下:
可以看出,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(); }
总结
- 以后遇到这种问题不能犯懒,一定严格测试搞清楚缘由再使用 -_-
评论区