java基础-inputStream两次读取的方法

2023-11-13

场景描述:我们需要对同一个InputStream对象使用多次。比如,客户端从服务器获取数据 ,利用HttpURLConnection的getInputStream()方法获得Stream对象,需要将InputStream流读取获取相关参数(第一次读取),又想把InputStream流中的数据写进文件缓存到本地(第二次读取)。

问题描述:第一次读取InputStream对象后,第二次再读取时可能已经到Stream的结尾了(EOFException)或者Stream已经close掉了,所有获取到的数据为null或者说没有获取到数据。

解决方法(一):
因为InputStream对象本身不能复制(InputStream没有实现Cloneable接口),所以先把InputStream转化成ByteArrayOutputStream,后面要使用InputStream对象时,再从ByteArrayOutputStream转化回来就好了,如下代码:
//获取客户端InputStream对象
InputStream input= requset.getInputStream();
//将InputStream对象转换成ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  
byte[] buffer = new byte[1024];  
int len;  
while ((len = input.read(buffer)) > -1 ) {  
    byteArrayOutputStream.write(buffer, 0, len);  
}  
byteArrayOutputStream.flush();                
//将byteArrayOutputStream可转换成多个InputStream对象,达到多次读取InputStream效果
InputStream inputStreamA = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
InputStream inputStreamB = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); 
//将InputStream转换成字符串
BufferedReader br = new BufferedReader(new InputStreamReader(inputStreamB,"UTF-8"));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
    sb.append(line);
}
解决方法二(获取inputStream 的open0方法,反射调用)
@Test
    public void testFileinp() throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        FileInputStream inputStream=new FileInputStream("E:/test/te.txt");
        FileOutputStream outputStream=new FileOutputStream("E:/test/te2.txt");
        FileOutputStream outputStreams=new FileOutputStream("E:/test/te3.txt");
        int len;
        byte [] by=new byte[8192];
        while ((len=inputStream.read(by))!=-1){
            outputStream.write(by,0,len);
        }
        if(inputStream.read()==-1){
            Class in=inputStream.getClass();
            Method openo= in.getDeclaredMethod("open0", String.class);
            openo.setAccessible(true);
            openo.invoke(inputStream,"E:/test/te.txt");
        }
        while ((len=inputStream.read(by))!=-1){
            outputStreams.write(by,0,len);
        }
        outputStream.close();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java基础-inputStream两次读取的方法 的相关文章

  • 我是否需要安装 SQLite 才能使 SQLiteJDBC 正常工作?

    我想我只是没有 明白 如果我的计算机上尚未安装 SQLite 并且我想编写一个使用嵌入式数据库的 Java 应用程序 并且我将 SQLiteJDBC JAR 下载 导入到我的项目中 那么这就是我所需要的吗 或者 我是否需要先安装 SQLit
  • TreeMap 删除所有大于某个键的键

    在项目中 我需要删除键值大于某个键的所有对象 键类型为Date 如果重要的话 据我所知TreeMapJava中实现的是红黑树 它是一种二叉搜索树 所以我应该得到O n 删除子树时 但除了制作尾部视图并一一删除之外 我找不到任何方法可以做到这
  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • 什么是抽象类? [复制]

    这个问题在这里已经有答案了 当我了解抽象类时 我说 WT H 问题 创建一个无法实例化的类有什么意义呢 为什么有人想要这样的课程 什么情况下需要抽象类 如果你明白我的意思 最常见的是用作基类或接口 某些语言有单独的interface构建 有
  • 将巨大的模式编译成Java

    有两个主要工具提供了将 XSD 模式编译为 Java 的方法 xmlbeans 和 JAXB 问题是 XSD 模式确实很大 30MB 的 XML 文件 大部分模式在我的项目中没有使用 所以我可以注释掉大部分代码 但这不是一个好的解决方案 目
  • 如何在单个查询中搜索 RealmObject 的 RealmList 字段

    假设我有一堂课 public class Company extends RealmObject private String companyId private RealmList
  • 如何检查某个元素是否存在于一组项目中?

    In an ifJava中的语句如何检查一个对象是否存在于一组项目中 例如 在这种情况下 我需要验证水果是苹果 橙子还是香蕉 if fruitname in APPLE ORANGES GRAPES Do something 这是一件非常微
  • 从jar中获取资源

    我有包含文件的 jar myJar res endingRule txt myJar wordcalculator merger Marge class 在 Marge java 中我有代码 private static final Str
  • 提高 PostgreSQL 1 亿数据左连接查询性能

    我在用Postgresql 9 2 version Windows 7 64 bit RAM 6GB 这是一个Java企业项目 我必须在我的页面中显示订单相关信息 有三个表通过左连接连接在一起 Tables TV HD 389772 行 T
  • 不可变的最终变量应该始终是静态的吗? [复制]

    这个问题在这里已经有答案了 在java中 如果一个变量是不可变的并且是final的 那么它应该是一个静态类变量吗 我问这个问题是因为每次类的实例使用它时创建一个新对象似乎很浪费 因为无论如何它总是相同的 Example 每次调用方法时都会创
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • 将 JScrollPane 添加到 JFrame

    我有一个关于向 Java 框架添加组件的问题 我有一个带有两个按钮的 JPanel 和一个添加了 JTable 的 JScrollPane 我想将这两个添加到 JFrame 中 我可以将 JPanel 添加到 JFrame 或将 JScro
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • 在java中以原子方式获取多个锁

    我有以下代码 注意 为了可读性 我尽可能简化了代码 如果我忘记了任何关键部分 请告诉我 public class User private Relations relations public User relations new Rela
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于

随机推荐

  • Angular和RxJS:添加REST API后端

    本文是SitePoint Angular 2 教程的第3部分 该教程有关如何使用Angular CLI创建CRUD应用程序 在本文中 我们将更新我们的应用程序以与REST API后端进行通信 更喜欢使用分步视频课程学习Angular 退房
  • 上传本地新项目到SVN服务器

    1 在一个已有检出的项目文件夹 如下的文件夹 1 就是我从svn检出的项目 中 在空白处 右键 gt TortoiseSVN gt Repo browser 这样就到了svn服务器的目录了 打开远程地址目录 2 创建一个文件夹给即将上传的项
  • 一文拿下弱网测试:3大弱网模拟工具的配置、场景弱网原因分析、面试题目……

    软件质量不是口头说说 要实际做起来 正文开始 如果app没有对各种网络异常进行兼容处理 那么用户可能在日常生活中遇到APP闪退 ANR 数据丢失等问题 因此 app网络测试 特别是弱网测试尤为重要 本文梳理了app网络测试要点和弱网测试常用
  • 2023年1月16日--2023年1月22日(osg+glsl+socket+ue, 本周20小时,合计1879小时,剩余8121小时)

    目前 ue视频教程进行到了zccs 预1 mysql 7 1 tf1 4 11 o s s 12 2 蓝图反射 1 9 moba 1 5 webapp 2 4 mmoarpg 00A 04 socket 2 57 Opengl 5 9 GL
  • 十三、传智书城项目设计

    项目源代码及sql脚本 一 项目概述 近年来 随着Internet的迅速崛起 互联网已成为收集信息的最佳渠道并逐步进入传统的流通领域 于是电子商务开始流行起来 越来越多的商家在网上建起在线商店 向消费者展示出一种新颖的购物理念 网上购物系统
  • yolo中iou_thres的含义及作用

    yolo中iou thres的含义及作用 iou thres 参数用于控制非极大值抑制 NMS 中的边界框合并阈值 较大的 iou thres 值会导致更多的边界框被合并 从而减少最终输出的边界框数量 是否将 iou thres 设置得更大
  • 图论进阶指南-银河(差分约束/DAG/tarjan)

    测评地址 题目大意 第一行给出两个整数N和M 之后M行 每行三个整数T A B 表示一对恒星 A B 之间的亮度关系 恒星的编号从1开始 如果T 1 说明A和B亮度相等 如果T 2 说明A的亮度小于B的亮度 如果T 3 说明A的亮度不小于B
  • 【STM32】串口初步使用

    本文只作为学习笔记 对串口进行一个简单的介绍 正确的使用方式还需要进行实际的调试 通信的类型 同步 异步 单工 双工 串行 并行 STM32的串口通信 配置片上外设的控制寄存器 通信双方进行相同的配置 约定共同的起始位 停止位 校验位 使得
  • Postman接口测试 —— 设置全局变量、参数传递、断言

    在能熟练使用postman运行接口请求后 会遇到一些问题 例如 我们的web网站一共有几十个接口 测试的时候如果要切换环境 这个时候要每个接口都要修改url的根路径 一个一个的改也太麻烦了 还有时候我们经常需要用到上一个接口的返回值 来作为
  • jQuery隔行变色

  • vant d的地址组件中文操作手册

    vant d的 学习手册 中文操作文档 开发指南 快速上手 基础组件 Empty 空状态 业务组件 地址列表 地址编辑 Area 省市区选择 Card 卡片 Contact 联系人 Coupon 优惠券选择器 GoodsAction 商品导
  • Oracle性能调整的误区

    共享服务器模式 MTS 集群技术 Clustering RAC 分区 并行处理 主要是并行查询 Oracle提供的这些特性确实是用来进行性能改善的 但我们往往忽略了对自身应用特性的分析 它们是否适合于我们 最近 通过对这方面知识的深入了解
  • 简析TCP的三次握手与四次分手原理

    简析TCP的三次握手与四次分手 TCP建立连接过程 第一次握手 建立连接 客户端发送连接请求报文段 将SYN位置为1 Sequence Number为x 然后 客户端进入SYN SEND状态 等待服务器的确认 第二次握手 服务器收到SYN报
  • Linux设备模型4 kobj_attribute

    在上文Linux设备模型 3 Kobject 实例中 我们介绍到如何使用default attribute Default attribute使用很方便 但不够灵活 比如上篇文章在Kobject一节中提到的那个例子 name和val这两个a
  • 单链表的操作(超详细),保证你看完不后悔

    新人小白的博客 希望大家多多关注 一起加油 共同成长 以后会经常更新哒 个人主页 收藏加关注 永远不迷路 数据结构系列 一 顺序表的操作 你真的学会了吗 二 顺序栈的基本操作 三 循环队列的基本操作 你学会了吗 文章目录 数据结构系列 前言
  • 2023浙江省赛“信息安全管理与评估“--Web渗透测试(高职组)

    2022全国职业技能大赛 信息安全管理与评估 高职组 任务书 2022全国职业技能大赛 信息安全管理与评估 任务书 第一阶段竞赛项目试题 第二阶段竞赛项目试题 第三阶段竞赛项目试题 任务2 Web渗透测试 2022全国职业技能大赛 信息安全
  • 发电厂指针仪表检测(YOLOv5训练)

    数据获取 最近在做工业指针仪表检测的项目 自己在网上爬取了3000多张图片 最后经过筛选得到了1214张质量好的图片 自己再进行精心标注 生成VOV格式的xml文件 训练 本人对其用yolov5进行训练后 效果显著 能够精准检测真实场景下仪
  • charles的使用

    一 charles的原理 1 1 Charles的原理 客户端向服务器发起HTTPS请求 Charles拦截客户端的请求 伪装成客户端向服务器进行请求 服务器向 客户端 实际上是Charles 返回服务器的CA证书 Charles拦截服务器
  • SQL学习记录1 --环境搭建, 初识数据库

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 ch00 环境搭建 0 1 MySQL 8 0 的安装 按照提示安装 几乎没遇到问题 有一步显示the specified port is already in use 是和
  • java基础-inputStream两次读取的方法

    场景描述 我们需要对同一个InputStream对象使用多次 比如 客户端从服务器获取数据 利用HttpURLConnection的getInputStream 方法获得Stream对象 需要将InputStream流读取获取相关参数 第一