在Java中,把不同的输入/输出源(硬盘、文件和网络连接等)抽象的表述为流(Stream),通过流的方式允许Java程序使用相同的方式访问不同的输入/输出源。流(Stream)是从源(Source)到接受(Sink)的有序数据。
一、输入流、输出流
说白了,就是我们使用程序接收、发送数据到文件或者其他设备的过程中,这些数据不可能瞬间全部发送或接受完成,它们得如同排队一样,按照规则来,这种过程形式就是流,至于怎么个规则法,就看java.io包下的一系列的规定了。
所以,按照流的划分,有输入流、输出流:
输入流(以InputStream和Reader为基类):只能从中读取数据,不能够反向向其写入数据。
输出流(以OutputStream和Writer为基类):即只能从中写入数据。
InputStream和Reader、OutputStream和Writer作为JavaIO流中涉及的40多个类的4个抽象基类,我们来看输入、输出流的模型图(我们把输入、输出设备抽象理解为水管):
输入流使用隐式记录指针来表示当前准备读取的位置,每当程序从InputStream或Reader取出一个或多个水滴后,记录指针自动向后移动相应的单位。
输出流同样使用隐式记录指针表示当前水滴即将放入的位置,每当程序向OutputStream或Writer输出一个或多个水滴后,记录指针自动向后移动相应的单位。
关于InputStream、OutputStream和Reader、Writer的区别:前者为字节流,字节流操作的最小数据单元为8位的字节。后者为字符流,字符流操作的最小数据单元为16位的字符。
何时使用何流,我们看图理解一下:
我们在划分输入、输出流的时候是根据程序运行时所在的内存来考虑的,所以,从内存→硬盘,使用的应当是输出流!
从Server到Client的过程中,我们使用网路传输数据,那么Server将数据传输到网络过程中,应当使用的是输出流,而Client从网络中获取数据的过程中,应当使用的是输入流!
二、节点流、处理流
节点流:从/向一个特定的IO设备(如磁盘等)读/写数据的流称为节点流,也称低级流。(即程序直接连接到数据源)
处理流:对一个已经存在的流进行连接或封装,通过封装后的流来进行读/写操作,也称为高级流。
至于使用处理流有什么好处,我们先来看处理流的模型:
优点:
→性能的提高:主要以增加缓冲的方式来提高输入/输出的效率。
→操作的便捷:处理流提供了一系列的便捷方式来一次性的输入/输出大量的内容,而不是输出/输入一个或多个“水滴”。
即我们使用处理流,将这些已存在的节点流包装成高级处理流,我们就可以使用相同的代码对这些不同的输入输出设备进行读写操作!