项目场景:
和金融机构联调接口时,读取接口传入的base64字符串
问题描述
和金融机构联调接口时,采用 new byte[inputstream.available] 读取接口传入的base64字符串时,数组bytes只存储了部分数据,导致后续操作报错
byte[] bytes = new byte[inputStream.available()]
原因分析:
inputStream.available()返回的是个预估值
具体分析:inputStream.available()
返回的是当前流可用长度(估计值),不是流的总长度。而在read方法读取流中数据到buffer中,但读取长度为1至buffer.length,若流结束或遇到异常则返回-1。也就是说当实际文件的长度超过此估计可用长度时也不会继续读,而是结束读取。从而导致读取的流并不完整
解决方案:
1 循环读取
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();
}
2 借助commons-io等工具类读取
byte[] recvData = IOUtils.toByteArray(inputStream);