1、IO流拓展
● io 流中对象很多,解决问题到底用哪个对象?
明确一:要操作的数据是数据源还是数据目的。
源:InputStream Reader
目的:OutputStream Writer
先根据需求明确要读,还是要写。
明确二:要操作的数据是字节还是文本?
源:字节-InputStream 文本-Reader
目的:字节-OutputStream 文本-Writer
明确三:明确数据所在的具体设备?
源设备:硬盘:文件 File 开头
内存:数组 字符串
键盘:System.in
网络:Socket
目的设备:硬盘:文件 File 开头
内存:数组 字符串
屏幕:System.out
网络:Socket
完全可以明白具体要使用哪个流对象
明确四:是否需要额外功能?
转换吗?转换流。InputStreamReader OutputStreamWriter
高效吗?缓冲区对象。BufferedXXX
● i/o 流体系结构
InputStream
FileInputStream
BufferedInputStream
OutputStream
FileOutputStream
BufferedOutputStream
Writer
OutputStreamWriter
FileWriter
BufferedWriter
Reader
InputStreamReader
FileReader
BufferedReader
2、Properties 类
● 概述:Properties 类表示一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
● 特点:1)Hashtable 的子类,map 集合中的方法都可以用。
2)该集合没有泛型。键值对都是字符串。
3)它是一个可持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化设备。
3、序列化接口
Serializable 标记接口。该接口给需要序列化的类,提供了一个序列化版本号。 serialVersionUID 该版本号中的目的在于验证序列化的对象和对应类是否版本匹配。
一个对象要能被序列化,必须实现 Serializable 接口。否则会发生异常 NotSerializableException 异常。
同时当反序列化对象时。如果对象所属的 class 文件在序列化之后进行修改,那么进行反序列化也会发生异常 InvalidClassException 。发生这个异常的原因如下:
1)该类的序列化版本号与从流中读取的类描述符的版本号不匹配
2)该类包含未知数据类型
3)该类没有可访问的无参数构造方法
注意:静态不能序列化。
4、打印流
● 特点:1)此流不负责数据源,只负责数据目的
2)为其他输出流添加功能
3)永远不会抛出 IOException,但是,可能抛出别的异常
● PrintStream 和 PrintWriter 的异同
同:两个打印流的方法完全一致
异:printstream 构造方法,接收 File 类型,接收字符串文件名,接收字节输出流 OutputStream
printwriter 构造方法,接收 File 类型,接收字符串文件名,接收字节输出流 OutputStream,接收字符输出流 Writer
● 打印流可以开启自动刷新功能
满足两个条件:1)输出的数据目的必须是流对象:OutputStream,Writer
2)必须调用 println,printf,format 三个方法中的一个,启动自动刷新
注意:print(char[] x)打印结果不是哈希值,而是遍历后字符数组。其实是为打印 String 准备的
第三方工具类 commons-io