当前位置: 首页 > news >正文

解决 InputStream 只能读取一次问题

是的,InputStream 的一个重要特性是它通常只能被读取一次。这是因为:

  1. 输入流通常是单向的、顺序访问的数据源

  2. 很多流(如网络流、文件流)读取后指针就移动了,无法回退

  3. 有些流(如Socket流)甚至读取后就消失了


使用 ByteArrayOutputStream 缓存数据

解决这个问题的常见方法是将 InputStream 的内容读取到 ByteArrayOutputStream 中缓存起来,然后可以多次使用:

// 原始输入流
InputStream originalInputStream = ...;// 创建字节数组输出流作为缓冲区
ByteArrayOutputStream buffer = new ByteArrayOutputStream();// 将输入流数据复制到缓冲区
byte[] data = new byte[1024];
int bytesRead;
while ((bytesRead = originalInputStream.read(data, 0, data.length)) != -1) {buffer.write(data, 0, bytesRead);
}buffer.flush();// 现在可以多次从缓冲区创建新的输入流
InputStream copy1 = new ByteArrayInputStream(buffer.toByteArray());
InputStream copy2 = new ByteArrayInputStream(buffer.toByteArray());

其他替代方案

  1. 使用 mark() 和 reset() 方法(如果流支持):

if (inputStream.markSupported()) {inputStream.mark(Integer.MAX_VALUE);// 第一次读取inputStream.reset();// 第二次读取
}

使用 Apache Commons IO 工具类

IOUtils.toByteArray(inputStream);  // 类似于上面的手动方法
IOUtils.copy(inputStream, outputStream);

使用 Java 9+ 的 InputStream.transferTo()

ByteArrayOutputStream buffer = new ByteArrayOutputStream();
inputStream.transferTo(buffer);

注意事项

  • 这种方法会将所有数据加载到内存中,不适合处理非常大的流

  • 对于大文件,考虑使用临时文件或其他存储方式

  • 记得关闭原始输入流和所有副本流

这种方法在需要多次处理相同流数据时非常有用,特别是在需要将同一份数据传递给多个处理器或消费者的场景中。

http://www.lryc.cn/news/608210.html

相关文章:

  • 位运算-371.两整数之和-力扣(LeetCode)
  • 9.3panic!最佳实践
  • 高效截图的4款工具深度解析
  • 从基础功能到自主决策, Agent 开发进阶路怎么走?
  • 自动化革命:软件开发的引擎与未来蓝图
  • 二、无摩擦刚体捉取——固定捉取
  • 第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2022年12月18日真题
  • C++刷题 - 7.27
  • Rust: 工具链版本更新
  • Kubernetes Service 全面详解:从概念到实践
  • 具身智能VLA困于“数据泥潭”,人类活动视频数据是否是“破局之钥”?
  • 北京-4年功能测试2年空窗-报培训班学测开-今天来聊聊我的痛苦
  • 对于考研数学的理解
  • Linux 系统管理-15-OpenSSH 服务管理
  • 【Pytorch✨】LSTM 入门
  • Next.js 怎么使用 Chakra UI
  • 洛谷做题4:P5713 【深基3.例5】洛谷团队系统
  • OAuth 2.0 详解:现代授权的核心协议
  • 知识随记-----Qt 实战教程:使用 QNetworkAccessManager 发送 HTTP POST
  • Web前端实现银河粒子流动特效的3种技术方案对比与实践
  • C#中的除法
  • 【Web】CCF智能汽车大赛-CTF遴选赛 wp
  • LVGL代码框架简介
  • 苹果MAC 安卓模拟器
  • 计算机网络:任播和负载均衡的区别
  • 【QT】Qt信号与槽机制详解信号和槽的本质自定义信号和槽带参数的信号和槽
  • 【Python修仙编程】(二) Python3灵源初探(11)
  • linux中pthread_t 的值与top -Hp中线程id值的区别
  • 知识随记-----用 Qt 打造优雅的密码输入框:添加右侧眼睛图标切换显示
  • Autosar Nm-网管报文PNC停发后无法休眠问题排查