OutputStream转InputStream

1、OutputStream转InputStream这是一个不合常理的想法

1.1、OutputStream和InputStream均是抽象类,它们内部并有保存数据的变量,转换并没有有意义,定义如下,
public abstract class InputStream implements Closeable {
    //...
}
 
 
public abstract class OutputStream implements Closeable, Flushable {
    //...
}
1.2、OutStream和InputStream的作用不同

一个OutputStream是用来写的,
一个IntputStream是用来读的。
假设一个是用来写"abc.txt",一个是用来读"abc.txt",这两的概念不同。

2、为什么有人想要OutputStream转InputStream

2.1 有个场景如下,后端需要生成一个文件,而开发者又不想在本地缓存(磁盘io效率低),所以在生成文件的时候,会得到一个OutputStream的流(OutStream便于输出文件),开发者这时候有需要将新生成的文件上传到文件服务器(一般文件服务提供的sdk需要的参数就是IntputStream,因为IntputStream便于读取需要上传的文件)。现在的情况就是生成的是OutStream类,但是上传的却是IntputStream,部分的开发者就会想“OutputStream如何转InputStream”这个问题。
2.2真正的解决方法是使用缓存数组和java继承思想

ByteArrayOutputStream是OutputStream的一个实现类,在生成文件的时候它可以代替OutputStream的位置,并且它里面会有个byte buf[],里面才是存储文件实际数据的变量

//定义如下
public class ByteArrayOutputStream extends OutputStream {
 
    protected byte buf[];
 
    //...
}

同理ByteArrayIntputStream是IntputStream的一个实现类,在生成文件的时候它可以代替IntputStream的位置。ByteArrayOutputStream转换ByteArrayIntputStream,其实就是转换里面byte数组

byte[] buffer =byteArrayOutputStream.toByteArray();
InputStream sbs = new ByteArrayInputStream(buffer);


1、这里需要注意的是,使用流生成文件时,只能将byte[]数组给取出,不能往外写,不然本地还是会生成文件;
2、如果使用原生方法toByteArray()获取不到数组值时,可以根据业务逻辑将生成文件时的byte[]给提取到可以取出的地方,最后放入ByteArrayInputStream里就可以了

转发原文地址

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值