目录
1. 处理流 BufferedReader 和 BufferedWriter
2. 处理流 BufferedlnputStream 和 BufferedOutputStream
3. 对象流 ObjectInputStream 和 ObjectOutputStream
4. 标准输入输出流 System.in 和 System.out
5. 转换流 InputStreamReader 和 OutputStreamWriter
6. 打印流 PrintStream 和 PrintWriter
1. 处理流 BufferedReader 和 BufferedWriter
(1)BufferedReader和BufferedWriter属于字符流,是按照字符类读取数据的。关闭处理流时,只需要关闭外层流即可。
(2)BufferedReader读取文件,代码演示:
(3)BufferedWriter写入文件,代码演示:
2. 处理流 BufferedlnputStream 和 BufferedOutputStream
(1)BufferedInputStream是字节流,在创建BufferedInputStream时,会创建一个内部缓冲区数组。
(2)BufferedOutputStream是字节流,实现缓冲的输出流,可以将多个字节写入底层输出流中,而不必对每次字节写入调用底层系统。
3. 对象流 ObjectInputStream 和 ObjectOutputStream
(1)序列化和反序列化
①序列化:在保存数据时,保存数据的值和数据类型。
②反序列化:在恢复数据时,恢复数据的值和数据类型。
③需要让某个对象支持序列化机制,则必须让这个类是可序列化的,为了让某个类是可序列化的,该类必须实现以下两个接口之一:
Serializable(标记接口,没有方法,推荐使用)
Externalizable(该接口有方法需要实现)
(2)ObjectInputStream和ObjectOutputStream是对象处理流,提供了对基本类型或对象类型的序列化和反序列化的方法。
(3)ObjectOutputStream提供 序列化功能。
(4)ObjectInputStream提供 反序列化功能。
(5)注意事项和细节
①读写(序列化和反序列化)顺序要一致。
②要求实现序列化或反序列化对象,需要实现Serializable。
③序列化的类中建议添加SerialVersionUID(序列化的版本号),为了提高版本的兼容性。
④序列化对象时,默认将里面所有属性都进行序列化,但static或transient修饰的成员不会序列化。
⑤序列化对象时,要求里面属性的类型也需要实现序列化接口。
⑥序列化具备可继承性,也就是 如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化。
(6)实例:使用ObjectOutputStream序列化 基本数据类型和对象,并保存到文件中。
(7)实例:使用ObjectInputStream读取文件,并反序列化恢复数据。
4. 标准输入输出流 System.in 和 System.out
基本介绍
编译类型 | 运行类型 | 默认设备 | |
System.in 标准输入流 | InputStream | BufferedInputStream | 键盘 |
System.out 标准输出流 | PrintStream | PrintStream | 显示器 |
5. 转换流 InputStreamReader 和 OutputStreamWriter
(1)基本介绍
①InputStreamReader:Reader的子类,可以将InputStream(字节流)包装成Reader(字符流)。
②OutputStreamWriter:Writer的子类,可以将OutputStream(字节流)包装/转换成Writer(字符流)。
③当处理纯文本数据时,使用字符流效率更高,并且可以有效解决中文问题,所以建议将字节流转换成字符流。
④可以在使用时指定编码格式(比如UTF-8,GBK,GB2312,ISO8859-1等)。
(2)实例:将字节流FileInputStream 转换为字符流 InputStreamReader,对文件进行读取。
(3)实例:将字节流FileOutputStream 转为字符流 OutputStreamWriter,对文件进行写入。
6. 打印流 PrintStream 和 PrintWriter
(1)打印流只有输出流,没有输入流。
(2)PrintStream是字节打印流,在默认情况下,输出数据的位置是标准输出,即输出到显示器。可以通过setOut()方法,修改打印流输出的位置/设备。
(3)PrintWriter是字符打印流。在使用指定位置输出时,必须要调用close()方法关闭流,closer()方法中才是真正的写入。