当前位置: 首页 > 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.xdnf.cn/news/1227925.html

相关文章:

  • 【多模态】DPO学习笔记
  • [创业之路-528]:技术成熟度曲线如何指导创业与投资?
  • Python爬虫实战:研究mahotas库,构建图像获取及处理系统
  • 【DeepSeek-R1 】分词系统架构解析
  • 社群团购市场选择与开源技术赋能下的下沉市场开拓策略研究——以开源AI智能名片、链动2+1模式与S2B2C商城小程序为例
  • LLM Prompt与开源模型资源(3)如何写一个好的 Prompt
  • 【论文笔记】Multi-Behavior Graph Neural Networks for Recommender System
  • “神威·太湖之光”:科技创新引擎与国家算力基石的崛起之路
  • jenkins从入门到精通-P1—九五小庞
  • 机器学习 —— 决策树
  • 【Linux网络】netstat 的 -anptu 各个参数各自表示什么意思?
  • 波士顿咨询校招面试轮次及应对策略解析
  • 个人电脑部署私有化大语言模型LLM
  • 操作系统-lecture5(线程)
  • Flutter镜像替换
  • LVGL + ESP-Brookesia 在Windows下的编译和运行
  • Flutter基础知识
  • 关于Web前端安全防御CSRF攻防的几点考虑
  • 常用git命令
  • 编译器工作原理的显微镜级拆解
  • 开箱即用的Next.js SSR企业级开发模板
  • 什么是doris
  • Typora v1.10.8 好用的 Markdown 编辑器
  • DreamBoards 借助 DreamHAT+ 雷达插件为 Raspberry Pi 提供 60GHz 毫米波雷达
  • 思途JSP学习 0801
  • 《软件测试与质量控制》实验报告一 测试用例设计
  • 逻辑回归参数调优实战指南
  • JS核心语法与实战技巧
  • 【读文献】Capacitor-drop AC-DC
  • 计数组合学7.10(舒尔函数的组合定义)