I----input---输入
o----output---输出
统一的外观:
所有读取数据的代码,都叫做read;
所有写入数据的方法,都叫做write;
三套I/O操作的api
BIO--基本的IO操作
NIO--异步的IO操作---web阶段
AIO--同步的IO操作---web阶段
IO流
BIO:有一套标准的流模型
1.区分输入与输出:
区分的关键在于立场; 永远站在程序的立场上考虑
2.确定管道的粗细---就是确定管道传输数据的最小单位
字节流和字符流。
人不能看懂的二进制数据,就是要字节传递。
人能看懂的文本数据,就是用字符传递。
我们要清楚两点:
1.字节流传递单位是最小的;理论上可以传递所有数据;
2.选择合适的管道,对于我们来说书写带来方便。
3.选择四大抽象类
InputStream----输入字节流
outputStream---输出字节流
Reader---输入字符流
Writer---输出字符流
4.更加应用场景确定具体管道使用的实现类
1.节点流---用于应用在流模型,确定的另一个端点是谁。
节点流可以单独使用,
2.操作流---在流传过程中做点额外的操作做动作。
操作在工作中不能单独使用,只能用于对接,最后一定要街道节点流身上去。
5.书写I/O流操作代码的标准步骤
第一步:先new出管道实现类
第二步:输出调用write方法,输入调用read方法
第三步:一定要关闭管道。
###对象的序列化和反序列化(对象流)
1、无论是对象的序列化还是反序列化都与文件无关;
对象序列化----把程序中的对象,以二进制流的形式输出;
反对象序列化---把程序中的二进制流对象,以对象的形式输出;
都操作流,都与文件无关,而且反序列化产生对象。
2、我们要做对象序列化和反序列化,要使用到的流是:ObjectOutputStream 和 ObjectInputStream。注意:前者是序列化;后者是反序列化。
对象流模型
对象序列化 FileOutputStream 对象 ----> 二进制流 -----> 目的 ObjectOutputStream
对象反序列化 FileInputStream 程序 <---- 二进制流 <---- 某源 ObjectInputStream
标识接口
我们之前所用的接口和自己设计的接口都是属于接口的第一种用法,即在没有继承关系的类当中让他们共享行为。
而类似于Serializable这样的接口,连方法都没有,所以设计它的理由一定不是上面共享行为的理由。 它的设计理由,是设计接口的第二种用法,即通过判断是否实现某个特殊接口,从而决定是否允许执行某种操作。
也就是说这种接口相当于是给实现了这个接口的类的对象,打上了一个标记,通过利用instanceof进行判定,从而允许或不允许做某个操作,就像通行证或是盖章一样。
回顾:什么是JavaBean?
即:两个必须,一个应该。
1、必须要有公共无参构造;
2、必须为属性提供符合命名规范的get/set方法; 命名规范是: 属性叫做 xxxx get方法 getXxxx(); set方法 setXxxx(); 后来在Java Bean规范的修正版本中,boolean的属性,它的get方法修正为is方法;
3、应该 实现Serializable接口;
transient
这个关键字是用来修饰属性的,凡是被这个关键字修饰的属性不参与序列化。那么被序列化出去的对象,该属性如果是基本数据类型那么值就是0,如果是引用数据类型值就是null。