文章目录

  • 0. 场景
  • 1. 原因
  • 2. 现象重现
  • 3. 解决方法
    • 1. 使用String字符串保留InputStream的内容
    • 2. 使用ByteArrayOutputStream保留InputStream的内容
  • 4. 总结

0. 场景

  1. 数据库中有个blob字段,存入数据的时候,需要传入相应的InputStream流,而我又需要InputStream流里面的内容判断其他事情。

  2. 也就是说 一个InputStream 我需要用两次

    public void test(InputStream in){String sql = "xxxx values(?) xxx";preparedStatement.setObject(in);execute();byte[] bufferOne = new byte[1024];int len = -1;while((len = in.read(bufferOne)) != -1){xxxx}xxxx 其他逻辑最后测试发现,下面in.read 读了个寂寞
    }
    

1. 原因

  1. 经过实际测试得出,InputStream不能读取两次,具体原因是,在读取InputStream的时候,其实内部是有个指针,它指示每次读取之后下一次要读取的起始位置,当你第一次读完的时候,指针已经指到最后了,当你再次读取的时候,自然是读不到数据的

2. 现象重现

public class demo_InputStream {public static void main(String[] args) throws Exception{InputStream is = demo_InputStream.class.getResourceAsStream("test.txt");byte[] buffer = new byte[1024];int len = -1;while((len = is.read(buffer)) != -1){System.out.println(new String(buffer,0, len));}System.out.println("-------------------");byte[] buffer2 = new byte[1024];len = -1;while((len = is.read(buffer2)) != -1){System.out.println(new String(buffer2,0, len));}is.close();}
}

3. 解决方法

1. 使用String字符串保留InputStream的内容

public class correctOne_InputStream {public static void main(String[] args) throws Exception {InputStream is = correctOne_InputStream.class.getResourceAsStream("test.txt");// builder 保留读到的数据StringBuilder builder = new StringBuilder();byte[] buffer = new byte[1024];int len = -1;while((len = is.read(buffer)) != -1){builder.append(new String(buffer, 0 ,len));}System.out.println("-------第一次需要InputStream,那么就创建一个-----------");InputStream isOne = new ByteArrayInputStream(builder.toString().getBytes());// 下面是测试新的InputStream到底是否有数据byte[] bufferOne = new byte[1024];len = -1;while((len = isOne.read(bufferOne)) != -1){System.out.println(new String(bufferOne,0, len));}System.out.println("-------第二次第一次需要InputStream,那么就再创建一个-----------");InputStream isTwo = new ByteArrayInputStream(builder.toString().getBytes());// 下面是测试新的InputStream到底是否有数据byte[] bufferTwo = new byte[1024];len = -1;while((len = isTwo.read(bufferTwo)) != -1){System.out.println(new String(bufferTwo,0, len));}is.close();isOne.close();isTwo.close();}
}

2. 使用ByteArrayOutputStream保留InputStream的内容

public class correctTwo_InputStream {public static void main(String[] args) throws Exception {InputStream is = correctTwo_InputStream.class.getResourceAsStream("test.txt");ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();int len;byte[] buffer = new byte[1024];while ((len = is.read(buffer)) != -1) {byteArrayOut.write(buffer, 0, len);}System.out.println("重构一个InputStream");InputStream isTwo = new ByteArrayInputStream(byteArrayOut.toByteArray());// 测试新的InputStream到底是否有数据byte[] bufferTwo = new byte[1024];len = -1;while((len = isTwo.read(bufferTwo)) != -1){System.out.println(new String(bufferTwo,0, len));}is.close();isTwo.close();}
}

4. 总结

  1. 总的来说,就是记录下来数据,需要inputStream 重新构建一个
  2. 源码地址:https://gitee.com/Lgold/learning/tree/dev/src/main/java/com/king/learning/InputStream

InputStream只能被读一次的原因以及解决方法相关推荐

  1. Java读取UTF-8格式txt文件第一行出现乱码及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法(转载)...

    原文地址:http://blog.csdn.net/jackpk/article/details/5702964/ Java读取UTF-8的txt文件第一行出现乱码"?"及解决 t ...

  2. Java读带有BOM的UTF-8文件乱码原因及解决方法(转)

    转载:http://www.linuxidc.com/Linux/2012-12/76707.htm 最近在处理文件时发现了同样类型的文件使用的编码可能是不同的.所以想将文件的格式统一一下(因为UTF ...

  3. 服务器光盘修复读不出盘,光驱不读盘的原因与解决方法

    光驱不读盘的原因与解决方法 当电脑光驱使用久了读盘能力差了就会出现有的光盘能读,有的光盘不能读,或是有的光盘读到一半就出现卡死的现象,这一般都是由于光驱个别部件老化或光头过于污浊而导致光驱不能读盘.解 ...

  4. Java读带有BOM的UTF-8文件乱码原因及解决方法

    Java读带有BOM的UTF-8文件乱码原因及解决方法 Java读带有BOM的UTF-8文件乱码原因及解决方法 - daimojingdeyu - ITeye技术网站 Java读带有BOM的UTF-8 ...

  5. win8计算机硬盘无响应,win8.1系统读不出移动硬盘的原因和解决方法

    一位用户说把移动硬盘插入win8.1系统电脑中没反应,读不出移动硬盘怎么回事呢?这是由于不当关机操作,导致电脑重启后无法识别和读取移动硬盘.找到原因后,接下来教程小编和大家分享win8.1系统读不出移 ...

  6. mysql只能导出65535条,Mysql报Rowsizetoolarge65535的原因及解决方法

    报错信息:Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535 ...

  7. win8系统读不出移动硬盘的原因和解决方法

    win8系统中移动硬盘无法识别 之前拔移动硬盘草率了点,并且电脑关闭也草率了点,导致之后电脑重启后无法识别和读取移动硬盘(只显示有usb的存储设备,但是在电脑中看不见移动硬盘相应的文件夹).网上查找后 ...

  8. MySQL局域网内访问慢的原因及解决方法

    转载自 http://blog.csdn.net/tiantang_1986/article/details/76890178 MySQL局域网内访问慢的原因及解决方法. 出现原因:主要是因为DNS服 ...

  9. MySQL 查询速度慢与性能差的原因与解决方法

    MySQL 查询速度慢与性能差的原因与解决方法 更新时间:2019年09月26日 18:05:47 作者:Microtiger 随着网站数据量与访问量的增加,MySQL 查询速度慢与性能差的问题就日渐 ...

最新文章

  1. 商淘多b2b2c商城系统怎么在个人电脑上安装_B2B2c商城系统怎么选?开源和定制哪个好?...
  2. SAP SD基础知识之物料确定(Material Determination)
  3. Windows 技术篇-减少对视频相关服务的cpu分配,减少cpu占用率
  4. php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解
  5. linux无法访问mysql_Linux下MySQL无法访问问题排查的基本步骤
  6. 微信8年,你从中学到了什么?
  7. 网易云信直播sdk的整体传输优化
  8. idea xml文件去掉背景黄色
  9. JavaScript 里变量名前面加了大括号代表什么含义
  10. 【渝粤教育】国家开放大学2018年春季 0233-21T学前儿童语言教育 参考试题
  11. 黑马Android全套视频无加密完整版
  12. centos gcc 版本安装9.3 c++17
  13. 奥的斯服务器显示chc,奥的斯服务器查看故障清除故障
  14. Leetcode 129. 根到叶子结点数字之和
  15. 如何应对当下的 996?
  16. 算法:Maximum Depth of Binary Tree(二叉树的最大深度)
  17. Java5国际认证SCJP试题精解,Java 5国际认证SCJP试题精解
  18. Python的EEMD实现
  19. 股票做手回忆录中的精华
  20. 简单A/BTest验证图片懒加载效果

热门文章

  1. 数据库大作业:Python实现疫苗接种数据库管理
  2. CentOs服务器下安装两个个MySql数据库踩坑日记
  3. 物流管理和计算机那个专业好,我是学计算机的女生,想跨专业考物流管理专业的研究生,好不好?...
  4. oracle 组内取最晚时间的记录
  5. 运用aspose的dll将word或excel转化图片并且拼接成为单张大图
  6. JavaScript 的三种书写位置,注释形式,变量的使用叙述
  7. 三菱FX3U底层源码,PLSR源码 总体功能和指令可能支持在RUN中下载程序
  8. 基于python+django+vue+mysql的天天生鲜商城
  9. vs+vtk读取.mhd格式文件出现ERROR:MetaImage cannot read data from file 问题。
  10. C++程序密码输入回显*