当前位置: 首页 > 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.dtcms.com/a/312054.html

相关文章:

  • Java语言核心特性全解析:从面向对象到跨平台原理
  • Docker--将非root用户添加docker用户组,解决频繁sudo执行输入密码的问题
  • 【动态规划 | 子序列问题】子序列问题的最优解:动态规划方法详解
  • RK628F HDMI-IN调试:应用接口使用
  • Vulnhub ELECTRICAL靶机复现(附提权)
  • QPainter::CompositionMode解析
  • junit总@mockbaen与@mock的区别与联系
  • flutter分享到支付宝
  • Linux进程控制核心:创建·等待·终止·替换
  • Qt 信号和槽正常连接返回true,但发送信号后槽函数无响应问题【已解决】
  • 深入解析Java Stream Sink接口
  • Design Compiler:Milkyway库的创建与使用
  • 1-7〔 OSCP ◈ 研记 〕❘ 信息收集▸主动采集E:SMB基础
  • 硬件-可靠性学习DAY1——系统可靠性设计指南:从原理到实践
  • Markdown 中的图表 Mermaid 与 classDiagram
  • Thread 中的 run() 方法 和 start() 方法的
  • 笔记:C语言中指向指针的指针作用
  • MQTT协议测试环境部署
  • 错误: 找不到或无法加载主类 原因: java.lang.ClassNotFoundException
  • (nice!!!)(LeetCode 每日一题) 2561. 重排水果 (哈希表 + 贪心)
  • UNet改进(29):记忆增强注意力机制在UNet中的创新应用-原理、实现与性能提升
  • 【嵌入式汇编基础】-ARM架构基础(三)
  • 动态规划解最长回文子串:深入解析与优化问题
  • 【redis】基于工业界技术分享的内容总结
  • JS的作用域
  • 第15届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2024年1月28日真题
  • sqli-labs:Less-20关卡详细解析
  • MFC 实现托盘图标菜单图标功能
  • 中州养老Day02:服务管理护理计划模块
  • 中之人模式下的虚拟主持人:动捕设备与面捕技术的协同驱动