1.节点流和处理流
节点流:直接从数据源或者目的地当中读取数据的流
处理流:不直接连接数据源和目的地,处理节点流的流,通过对其他流进行处理进而提高了程序的性能。
节点流处于io操作的第一线,所有的操作必须通过他来进行,处理流对于其他流进行操作,(提高效率和操作灵活性。)
处理流不断的增大了处理的范围,对于其他流进行了处理提高了性能,提高的效率和操作的灵活性。
一:缓冲流
1.字节缓冲流
BufferedInputStream
BufferedOutputStream
2.字符缓冲流
BufferedReader
BufferedWriter
BufferedInputStream实现原理:
* BufferedInputStream有一个缓存区间,默认大小为8kb,每次调用read方法时,会先尝试从缓存区域当中获取内容,
* 如果读取失败就说明缓存区域没有数据,然后从数据源中获取数据,读取数据时会尽可能的尝试获取更多的字节,然后把这些
* 字节放入缓存区域当中,最后在将缓存区的内容或者全部缓存给用户,直接从缓存区读取数据会比直接从数据源读取数据的
* 速度快,所以效率更高,性能更好。
*
*
* 简单来说:
* 没有缓冲区,那么每read一次,就会发送一次I/O操作。
* 有缓冲区,每read一次,会一次读取多个字节放入缓冲区,然后后续的read都会从缓冲区当中读取,
* 当read到缓冲区末尾时,会再次读取多个字节放入缓冲区。
【转换流】
作用:将字节流转换成字符流,乱码,编码和解码的问题。
1.编码与解码的概念:
解码: 二进制-----解码字符集----》字符
编码: 字符-------编码字符集----》二进制
2.乱码会出现的原因:
1.编码和解码的字符集造成了乱码
2.字节缺失,长度丢失
内存流或者字节数组流
ByteArrayInputStream :字节数组输入流
ByteArrayOutputStream :字节数组输出流。
数据处理流
DataInputStream
DataOutputStream
既能保存数据,又能数据类型。 只能保留基本类型+String
序列化流:
ObjectInputStream
ObjectOutputStream
保留引用数据(对象)数据+类型
序列化:将对象保存在文件里或者保存在字节数组当中,称之为序列化。
把对象转换为字节序列的过程称之为对象的序列化。
反序列化:将文件或者字节数组转换成对象,就是反序列化。
将字节序列恢复成对象的过程称之为对象的反序列化。
注意点:
1.先序列化在反序列化。反序列化的顺序必须要与序列化一致。
2.不是所有的对象都可以被序列化,只能实现了Serializable 接口的类的对象才能被序列化。
3.不是所有的属性都需要序列化。 transient
对象序列化的主要功能:
1.把对象的字节序列永远的保存在硬盘上,通常会存放到一个文件中。
2.在网络上传送对象的字节序列。
反序列化: 输入流 ObjectInputStream
序列化: 输出流 ObjectOutputStream