InputStream类available和read方法读取流数据不全?
本文共 1,103 字,预计阅读时间 4 分钟
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(); }
有时也不能只使用系统自动的方法,容易掉坑。
就是这么简单,你学废了吗?感觉有用的话,给笔者点个赞吧 !
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!