文件流:
文件在程序中是以流的形式来操作的;
流:数据在数据源(文件)和程序(内存)之间经历的路径
输入流:数据从数据源(文件)到程序(内存)的路径
输出流:数据从程序(内存)到数据源(文件)的路径
IO流分类:
按操作数据单位不同分为:字节流(8bit) -> 二进制文件;字符流(字符) -> 文本文件
按数据流的流向不同分为:输入流、输出流
按流的角色不同分为:节点流,处理流/包装流
抽象基类 | 字节流 | 字符流 |
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
[Java的IO流共涉及40多个类,都是从上面的四个抽象基类派生的]
节点流和处理流的区别和联系:
1、节点流是 底层流/低级流,直接跟数据相连
2、处理流(包装流)包装节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出
例:BufferedReader类中,封装了Reader属性,即:可以封装一个任意的节点流,只要是Reader抽象类的子类
3、处理流对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连
处理流的功能主要体现:
1、性能的提高:主要以增加缓存的方式来提高输入输出的效率
2、操作的便捷:处理流提供了一系列便捷的方法来一次输入输出大批量的数据,使用更加灵活方便
序列化和反序列化:
(1)序列化就是在保存数据时,保存数据的值和数据类型
(2)反序列化就是在恢复数据时,恢复数据的值和数据类型
(3)需要让某个对象支持序列化机制,则必须让这个类是可序列化的 -> 这个类必须实现如下两个接口之一;
Serializable // 这是一个标记接口,没有方法
Externallizable // 该接口有方法需要实现,因此使用时一般实现上面的 Serializable接口
ObjectOutputStream -> 提供序列化功能
ObjectInputStream -> 提供反序列化功能
对象处理流的序列化和反序列化需注意:
1、读写顺序要一致
2、要求序列化和反序列化对象,需要实现Serializable接口
3、序列化的类中建议添加serialVersionUID 序列化的版本号,可以提高兼容性
4、序列化对象时,默认将里面所有属性都序列化,除了static或transient修饰的成员
5、序列化对象时,要求里面属性的类型也需要实现序列化接口
6、序列化具有可继承性,即如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化