首页 > 编程语言 >Java将OutputStream转为InputStream

Java将OutputStream转为InputStream

时间:2023-01-06 17:25:44浏览次数:61  
标签:wordObj OutputStream Java 读取 InputStream 内存 new UtilB

遇见的问题:做文件处理时,有两个工具类,一个是生成文件,需要一个OutputStream来写出,一个是上传文件,需要一个InputStream来读取

类似代码:

// wordObj处理之后需要写出到一个输出流中
wordObj.write(OutputStream out);
// ...
// 工具类B读取一个输入流
UtilB.read(InputStream in);

使用File类进行转换

第一种方法是wordObj将文件写出到一个临时目录,UtilB读取之后再将临时文件删除,这种方式是最慢的,需要访问硬盘进行读写。

使用ByteArrayStream类进行转换

第二种方法是使用ByteArrayStream进行转换,这种方法会将写出的文件保存在内存中,然后被工具类读取,伪代码如下:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 写入
wordObj.write(baos);

ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());

// 读取
UtilB.read(bais);

这种方式比较简单,缺点是比较占用内存,而且数据需要在内存中复制来复制去,效率不够高。

(重点)使用PipedStream类进行转换

参考StackOverFlow高赞回答,根据实际情况进行了修改

PipedInputStream pipedInputStream = new PipedInputStream();

final CountDownLatch cdl = new CountDownLatch(1);

// 使用PipedStream时不能在同一个线程
// 这里使用了hutool的全局线程池,直接((Runnable)() -> {}).start()也可以
ThreadUtil.execute(() -> {
    try (PipedOutputStream pipedOutputStream = new PipedOutputStream(pipedInputStream)) {
        cdl.countDown();
        wordObj.write(pipedOutputStream);
    } catch (IOException e) {
        e.printStackTrace();
    }
});

// 等待输出管道准备好时再开始读取输入管道
cdl.await();
// 读取
UtilB.read(pipedInputStream);

这种方式的优点是不占用内存,并且效率更高,没有数据在内存中拷来拷去,缺点是更加复杂了

标签:wordObj,OutputStream,Java,读取,InputStream,内存,new,UtilB
From: https://www.cnblogs.com/lixin-link/p/17031059.html

相关文章

  • java基础:UDP通信
    原文:Java实现UDP通信-简书(jianshu.com)UDP(UserDatagramProtocol),即用户数据报协议,UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据......
  • java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.getXmlStandalo
    一、问题复现这个问题困扰我一天多,各种百度看论坛,发现有一种解决方案可能对我有帮助(解决方案)解决方案说的是可能是xerces包冲突所致Causedby:java.lang.AbstractMe......
  • Java生成二维码并浏览器下载,也可打包成zip下载
    不说废话,直接上代码1.单个生成二维码并下载codeNo为前端传的需要生产二维码的内容publicvoidqrCode(HttpServletRequestrequest,HttpServletResponseresponse,Stri......
  • Java8-Stream流式计算
    什么是Stream流式计算大数据:存储+计算集合、MySQL本质就是存储东西的;计算都应该交给流来操作!Stream是对集合功能的增强,它提供了各种非常便利、高效的聚合操作,可以大......
  • 第13届蓝桥杯javaB组
    第13届蓝桥杯javaB组试题A星期计算问题描述已知今天是星期六,请问\(20^{22}\)天后是星期几?注意用数字\(1\)到\(7\)表示星期一到星期日。思路一因为每七天一个......
  • java基础
    Java规范Java的编译过程记事本写java的步骤publicclass类名{publicstaticvoidmain(String[]args){System.out.println("Hello,World"); }}编写......
  • 简单java servlet的登录脚本,部署到docker
    先打算参考这篇文章Simpleloginpageexampleusingjspservlet-Candidjava内含war文件和zip文件。但是tomcat上该war文件总是报错。于是又参考这篇(46条消息)Jav......
  • JavaScript
    JavaScript1.基本语法//1.定义变量变量类型变量名=变量值;varnum=1;alert(num)//2.条件控制varscore=81;if(score>60&&score<70){alert("......
  • Java中的POJO与JavaBean / Java Bean与POJO的区别与联系
    POJO(PlainOrdinaryJavaObject)即普通Java类,具有一部分getter/setter方法的那种类就可以称作POJO。有一些private的参数作为对象的属性,然后针对每一个参数定义get和set......
  • Java final关键字修饰对象
    结论:final修饰对象,对象的内容可变,引用不可变。final应用于类、方法和变量、对象时意义是不同的,但本质是一样的,都表示不可改变。但是修饰对象时要注意:因为对象是引用类......