Java的IO是实现输入输出的基础,Java中把不同的输入/输出源(键盘,文件,网络连接)抽象的表述为"流",stream.
流的分类
输入流和输出流
按照流的流向来分
- 输入流 只能从中读数据,而不能向其中写数据
- 输出流 只能向其中写出数据,而不能从中读取数据
此处的输入,输出涉及到一个方向问题,数据从内存到硬盘,被称为输出流,也就是说,这里的输入输出都是从程序运行所在内存的角度来划分的.
字节流和字符流
- 字节流和字符流的区别仅在于字节流操和字符流操作的数据单元不同,字节流操作的最小数据单元是8位字节,而字符流操作的最小数据单元是16位的字符.
- 字节流由InputStraem,OutputStrem作为基类,字符流由Reader,Writer作为基类.
节点流和处理流
按照流的角色分,可以分节点流和处理流
- 可以从/向一个特定的IO设备(磁盘 网络)读/写数据流,称为节点流,节点流也被称为低级流(Low Level Stream).
- 使用节点流进行输入/输出时,程序直接连接实际的数据源,和实际的输入输出节点连接.
处理流则用于对一个已经存在的流进行连接或封装,通过封装后流来实现读/写功能.处理 流也称为高级流.
当使用处理流来进行输入/输出时,程序并不会连接到实际的数据源,没有和实际的输入/输出连接.使用处理流明显的好处是,只要使用相同的处理流,程序就可以采用完全的输入/输出代码来访问不同的数据源,随着处理流所包装的节点流改变,程序实际所访问的数据源也相应发生改变
Java使用处理流来包装节点是一种典型的装饰器设计模式,通过处理流来包装不同节点,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入/输出功能
流的概念模型
Java把所有设备里的有序数据抽象成流模型简化了输入/输出的处理.
Java的IO流设计40多个类,是从4个抽象基类派生出来的:
- InputStream/Reader 所有输入流的基类,,前者是字节输入流,后者是字符输入流.
- OutputStram/Writer 所有输出流的基类,前者是字节输出流,后者是字符输出流.
通过使用处理流,Java程序无须理会输入/输出节点是磁盘,是网络还是其他输入/输出设备,程序只要将这些节点包装成高级处理流,就可以使用相同的输入/输出代码来读写不同输入输出的设备.