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);