很多网上和个人对IO流的讲解让我有了错误的认识,这里我说下我自己的看法!
首先,就是一定要明确流和数据源的区别,这是在开始学习流的时候很容易被误导的地方!往往容易异想天开的把两者混为一谈!
数据源就是数据源,是数据的本源,是数据实体。而流仅仅是一个嫁接在这个本源上的管道,一个从外界获取或者向外界发送数据的通道而已,它本身并不是数据,这一点很容易被误导。
而根据用途的不同,java提供了一下几种IO流类库:
a)标准输入输出
b) 文件的操作
c)网络上的数据流
d)字符串的流
e)对象流
f) zip文件流
至于别的分类这里不做过多赘述,网上有很多详解。但是,有一种分类非常重要,如下:节点流: 用于直接操作目标设备的流
过滤流: 是对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能。
节点流是IO操作的根本,其余都只是对节点流的功能的扩展而已。四大基类:
InputStream是表示字节输入流的所有类的超类,需要定义 InputStream 子类的应用程序必须总是提供返回下一个输入字节的方法,数据单位都是字节(8位)
OutputStream表示输出字节流的所有类的超类,输出流接受输出字节并将这些字节发送到某个接收器,数据单位都是字节(8位)
Reader用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。数据单位都是字符(16位)
Writer写入 字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。数据单位都是字符(16位)注意的是,这四个顶层类都没有实现Serializable接口。
java.io.Serializable虽然属于IO框架,但其并不是直接作用于IO框架四个顶层IO类及其子类,而是作用于其它对象,使其可被序列化,再通过IO类对其进行输入输出。如:File、ObjectStreamClass、String。
JDK所提供的所有流类位于java.io包中,都分别继承自以上四种抽象流类。
JDK的I/O包中主要使用到了两种设计模式:Adatper(适配器)模式和Decorator(装饰器)模式
装饰模式的角色
-抽象构件角色(component):给出一个抽象接口,以规范准备接受附加责任的对象
-具体构件角色(concrete component):定义一个将要接受附加责任的类
-装饰角色(decorator):持有一个构件(component)对象的引用,并定义一个与抽象构件接口一致的接口。
- 具体装饰角色(concrete decorator):负责给构件对象“贴上”附加的责任装饰模式中装饰类拥有被装饰类的引用,然后装饰类还实现了和被装饰类一样的接口,所以具有和被装饰类一样的方法,在这个装饰类的方法中可以直接调用被装饰类的相同方法,并且在该方法中可以任意扩展该方法,这样就达到了扩展被装饰类的功能。