字符流:专门用来处理文本文件(能看懂的文本文件)
Read:这个抽象类表示字符输入流的所有类的父类
Write:这个抽象类表示字符输出流的所有类的父类
OutputStreamWrite:文件字符输出流(具体的字符输出流实现类)
OutputStreamWrite(OutputStream out)创建文件字节输出流写入文件
注意:字符流构造中的参数不是具体的文件路径 而是字节流对象
说明了字符流才具体的操作文件内容时,本质上还是通过字节流操作
InputStreamReader:文件字符输入流(具体的字符输入流实现类)
OutputStreamReader(OutputStream out)创建文件字节输入流读取文件
便捷字符流:
通过OutputStreamWrite和InputStreamRead构造对象太繁琐,这里可以使用子类FileWrite和FileRead来构建对象
使用方式:FileWrite(Stirng fileName)
注意:FileWrite和FileRead不能指定编码表,只能使用默认的编码格式
字符缓冲流:针对于换行符有特殊的操作方式
读readLine():可以一行读取(不包含换行符)
写newLine():自动识别换行符,可以忽略具体的换行符号(\n | \r | \r\n)
BufferedRead:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。 可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。
BufferedWrite:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。 可以指定缓冲区大小,或者可以接受默认大小。 默认值足够大,可用于大多数用途。
构造方法:
BufferedRead(Read in);
BufferedWrite(Write out);
对象流:
对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型,对象中存储的对象详细信息
字节序列写入到文件之后,相当于文件持久保存了一个对象的信息
反之,改该字节序列也可以从文件中读取对象信息,称之为反序列化
对象流:
对象序列化流:ObjectOutputStream
对象反序列化流:ObjectInputStream
注意:类想要实现序列化或反序列化必须实现Serializable
Serializable接口中什么都没有,只是一个标识,标识当前类可以进行序列化
版本号的问题:
序列化一个对象之后,类文件发生更改,
会出现InvalidClassException:
因为当序列化运行时检测到类中的以下问题之一时抛出。
类的串行版本与从流中读取的类描述符的类型不匹配
该类包含未知的数据类型
该类没有可访问的无参数构造函数
解决方案:
在类中增加一个版本标识信息(序列化对象时,会由系统分配的版本标识)
protected static final long serialVersionUID = 42L;
成员变量如何不被序列化?
给该成员加上一个transient关键字修饰,标识了该成员不参与序列化