/*
* 操作字节数组的两个流对象:ByteArrayInputStream与ByteArrayOutputStream
*
* 【特别注意】
* 这两个流对象操作的源和目的都是内存,是专门用于操作内存的流。
*
* 查找API,ByteArrayOutputStream说明:
* 此类实现了一个输出流,其中的数据被写入一个 byte 数组(可变长度)。缓冲区会随着数据的不断写入而自动增长。
* 可使用 toByteArray() 和 toString() 获取数据。
*
* 【ByteArrayOutputStream关键点】
* 1.由于该类没有调用底层资源,只是在内存中操作数据(如操作数组等),所以该流不需要关闭,关闭无效;
* (别的流调用底层资源,需要关闭,节省空间,腾出资源)
* 2.此类中的方法在关闭此流后仍可被调用。(不管关不关该流,其内方法均能用,因为关闭无效。)
* 3.不需要抛出IOException。
*
* 【ByteArrayInputStream关键点】
* 1.包含一个内部缓冲区,该缓冲区包含从流中读取的字节
* 2.内部计数器跟踪 read 方法要提供的下一个字节
* 3.关闭该流无效
* 4.不需要throws IOException
*
* 【注意】
* 需要源,相当于之前操作文件之前必须给一个文件,该源就用ByteArrayInputStream产生,其内有构造函数:
* public ByteArrayInputStream(byte[] buf)
* 创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组。pos 的初始值是 0,count 的初始值是 buf 的长度。
*/
package demo;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
public class Demo {
public static void main(String[] args) {
//明确源是一个字节数组,将abcdef写入到该数组中
ByteArrayInputStream bis = new ByteArrayInputStream("abcdef".getBytes());
ByteArrayOutputStream bos = new ByteArrayOutputStream();//明确目的
//由以上可知,bis和bos内部自带缓冲区(即数组buf),所以不需要手动指定缓冲区
//读写方法和以前一样,【注意】不要关流,没用
int ch = 0;
while((ch=bis.read())!=-1){
bos.write(ch);
}
System.out.println(bos.toString());//输出abcdef
}
}
/**
* 【什么时候用这两个类】
* 需求分析时候,发现源是内存,那么直接用ByteArrayInputStream,发现目的是内存,那么直接用ByteArrayOutputStream,
*
* 如果源和目的其中一个需要操作内存,另一个需要操作文件,那么需要操作内存的那个就可以用这俩类之一,操作目的的该用啥用啥。
*/
/*
* ByteArrayInputStream和ByteArrayOutputStream具体方法见API,没什么新方法,都大同小异,提一个方法:
*
* 其中ByteArrayOutputStream类中的特有方法:public void writeTo(OutputStream out) throws IOException
* 将此 byte 数组输出流的全部内容写入到指定的输出流参数中。
*/
/*
* 还剩余4个流对象,其中操作字符数组:CharArrayReader与CharArrayWriter,其内部自带字符数组作为缓冲区,且这俩是字符流
*
* 操作字符串:StringReader与StringWriter,其内部自带String,这俩是字符流,用于操作字符串。
*/
24-IO流-64-IO流(操作数组的流)
最新推荐文章于 2022-01-27 08:21:01 发布