ByteArrayOutputStream和ByteArrayInputStream
一、ByteArrayOutputStream 字节数组的输出流
内存操作流:顾名思义,读写都在内存中
特点:
(1)数据读写都在内存中,不需要关联源文件和目标文件;
(2)适用于网络中小型数据的传输(图片、文件、小视频);因为缓冲数组的扩容总是有限度的
(3)通过源码可以看出,有一个内置byte数组作为缓冲区(如果不指定的话),缓冲区会随写入的数据自动扩容
(4)此类中的方法在关闭此流后仍可被调用---(JVM去做的事情)两个流都适用,相关链接 点击打开链接
(5)是抽象字节流的子实现类
常用ByteArrayOutputStream来进行文件的读写,通过(1)"toString()"和(2)"toByteArray"结合"new String(bytes,0,len)"的方法
二、独特的方法
(1)void writeTo(OutputStream out)
说明:将此 byte 数组输出流的全部内容写入到指定的输出流参数中;用处,保存内存操作流程中的数据到文本文件中
(2)void reset()
说明:将此 byte 数组输出流的 count 字段重置为零;理解为清空此操作流中的缓存
(3)byte[] toByteArray()
---相当于读数据
说明:获取此操作流中的缓存数据,以字节数组的形式;而要想获得字符串,还得结合String的构造方法
(4)String toString()
----相当于读数据
说明:使用平台默认的字符集(也可以自己设置),通过解码字节将缓冲区内容转换为字符串
(5)int size()
说明:返回缓冲区的当前大小;作用:主要看数据写入的时候是否自动扩容
练习
package cutpointdownloaddemo;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class ByteArrayDemo {
public static void main(String[] args) throws IOException {
/*
* 内存操作流:不去读写文件,在内存中的缓存区域 进行读写
*a:操作字节数组
ByteArrayOutputStream
ByteArrayInputStream
此流关闭无效,所以无需关闭
b:操作字符数组
CharArrayWrite
CharArrayReader
c:操作字符串
StringWriter
StringReader
* */
/*ByteArrayOutputStream 会在内存中开辟一个byte数组,作为他的缓冲区,那这个缓冲区会自动增长
此类实现了一个输出流,其中的数据被写入一个 byte 数组。
缓冲区会随着数据的不断写入而自动增长。
可使用 toByteArray() 和 toString() 获取缓冲区中的数据。
关闭 ByteArrayOutputStream 无效。
此类中的方法在关闭此流后仍可被调用,
而不会产生任何 IOException。*/
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//把数据存到自己的缓冲区中去
bos.write("白发戴花君莫笑,岁月从不败美人".getBytes());
bos.write("接天莲叶无穷碧,映日荷花别样红".getBytes());
//取出缓冲区中的数据
byte[] bytes = bos.toByteArray();
/*
读取数据的方式1:把这个字节数组转成字符串
String s = new String(bytes);
System.out.println(s);
*/
//读取数据的方式2:直接转化成字符串
String string = bos.toString();
System.out.println(string);
//读取数据的方式3:ByteArrayInputStream
read(bytes);
}
/**
*
* @param bytes:表示数据对应的字节数组缓冲区
* @throws IOException
*/
private static void read(byte[] bytes) throws IOException {
//从缓冲区中读取数据
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
byte[] bytes1 = new byte[1024*8];
bis.read(bytes1);//读取到的数据还得拿出来放到自己定义的缓冲区中
String string = new String(bytes1);
System.out.println(string.trim());//去掉两端的空格
}
}
三、ByteArrayInputStream
特别说明:如果用此流读读取数据特别麻烦,首先要通过流对象构造方法创建缓存数组,然后读取数据到数组中,转化成字节数
组,最后再转化成字符串,没有ByteArrayInputStream流便捷
注意:它的"read"的两种重载形式是非阻塞的形式
补充:关于字节数组转换为字符串的其它方法--String.valueOf(bytes)