字节缓冲流:避免了底层系统的多次调用
BufferedOutputStream:该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。
BufferedInputStream:创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次有多个字节。
构造方法:
BufferedOutputStream(OutputStream out)
BufferedInputStream(InputStream input)
注意:
字节缓冲流仅仅提供缓冲区,真正的读写数据还是依靠基本的字节流对象进行操作
使用BufferedOutputStream调用writer不在是直接写入到文件,而是写入到缓冲区
想要把数据写入到文件,有三种方式
1.flush
2.close
3.缓冲区满了自动刷新
编码和解码
二进制和字母或字符之间的转换规则
编码:
byte[] getBytes():使用平台的默认字符编码集将String存储字节数组
byte[] getBytes(String chareName):使用指定的编码集String存储字节数组
解码:
String(byte[] bytes):通过默认字符集解码指定的数组来构造新的String
String(byte[] bytes,String chareName):通过指定字符集解码指定的数组来构造新的String
注意:
编码和解码一定要保证一直,不然会出现乱码问题
常用编码集GBK和UTF-8
GBK是把一个字符转换成2个字节
UTF-8把一个字符转换成3个字节
字符流:专门用来处理文本文件(能看懂的文本文件)
Read:这个抽象类表示字符输入流的所有类的父类
Write:这个抽象类表示字符输出流的所有类的父类
OutputStreamWrite:文件字符输出流(具体的字符输出流实现类)
OutputStreamWrite(OutputStream out)创建文件字节输出流写入文件
注意:字符流构造中的参数不是具体的文件路径 而是字节流对象
说明了字符流才具体的操作文件内容时,本质上还是通过字节流操作
InputStreamReader:文件字符输入流(具体的字符输入流实现类)
OutputStreamReader(OutputStream out)创建文件字节输入流读取文件
便捷字符流:
通过OutputStreamWrite和InputStreamRead构造对象太繁琐,这里可以使用子类FileWrite和FileRead来构建对象
使用方式:FileWrite(Stirng fileName)
注意:FileWrite和FileRead不能指定编码表,只能使用默认的编码格式
字符缓冲流:针对于换行符有特殊的操作方式
读readLine():可以一行读取(不包含换行符)
写newline():自动识别换行符,可以忽略具体的换行符号(n | r | rn)
BufferedRead:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。 可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。
BufferedWrite:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。 可以指定缓冲区大小,或者可以接受默认大小。 默认值足够大,可用于大多数用途。
构造方法:
BufferedRead(Read in);
BufferedWrite(Write out);
对象流:
对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型,对象中存储的对象详细信息
字节序列写入到文件之后,相当于文件持久保存了一个对象的信息
反之,改该字节序列也可以从文件中读取对象信息,称之为反序列化
对象流:
对象序列化流:ObjectOutputStream
对象反序列化流:ObjectInputStream
注意:类想要实现序列化或反序列化必须实现Serializable
Serializable接口中什么都没有,只是一个标识,标识当前类可以进行序列化
版本号的问题:
序列化一个对象之后,类文件发生更改,
会出现InvalidClassException:
因为当序列化运行时检测到类中的以下问题之一时抛出。
类的串行版本与从流中读取的类描述符的类型不匹配
该类包含未知的数据类型
该类没有可访问的无参数构造函数
解决方案:
在类中增加一个版本标识信息(序列化对象时,会由系统分配的版本标识)
protected static final long serialVersionUID = 42L;
成员变量如何不被序列化?
给该成员加上一个transient关键字修饰,标识了该成员不参与序列化