流
流的概念
在Java 程序中,对于数据的输入输出操作以流Stream方式进行,JavaSE 提供各种各样的类用于使用相同的方法获取不同类型的数据,程序中通过标准的方法输入或者输出数据
流是处理输入/输出的一个洁净的方法, 它不需要代码理解盘和网络的不同。Java 中流的实现是基于java.io 包定义的类层次结构的
流的分类
版本
从Java不同版本来说,流可以分为BIO、NIO和AIO。可以理解为是Java语言对操作系统的各种IO模型的封装。我们在使用这些API的时候,不需要关心操作系统层面的知识,也不需要根据不同操作系统编写不同的代码,只需要使用Java的API就可以了。
- BIO即同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成
假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶,但是实际上线程在等待水壶烧开的时间段什么都没有做
- NIO即同步非阻塞,一个线程不断的轮询每个输入输出的状态改变,如果有状态发生了改变,则进行下一步的操作
拿烧开水来说,NIO的做法就是叫一个线程不断地轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作
- AIO即异步非阻塞I/O模型,无需一个线程去轮询所有IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理
对应烧开水的例子就是,为每个水壶上面装了一个开关,水烧开后,水壶会自动通知我水烧开了
流向
按流向分为输入流和输出流,可以从输入流读取数据但不能写,要从输入流读取数据,则必须有一个与这个流相关的字符源
传输单位
按传输单位分为字节流和字符流
- Java具备平台无关性,这里的字节是指8位,字符是16位
- 字节流从InPutStream/OutPutStream 派生出来,以字节为基本处理单位,一般用于操作二进制数据,字节次序是有意义的
- 字符流从Reader/Writer派生出来的,以16位的Unicode码表示字符为基本处理单位,一般用于操作字符数据
- 使用桥接流可以实现两个流之间的转换
字符流就是字节流读取文字字节数据后,不直接操作而是先查指定的编码表以获取对应的文字。简单的说就是:字符流 = 字节流 + 编码表
- 字符流的的两个顶级父类:Reader和Writer
- 字节流的的两个顶级父类:InputStream和OutputStream
- 输入输出靠reader和writer,inputstream和outputstream 四个类和子类支持
- 读入的内容有对象,字符,图像和声音等
功能
按功能可以分为节点流和过滤流
- 节点流:负责数据源和程序之间建立连接,节点流对特定的地方进行读写
- 过滤流:用于给节点增加功能,过滤流使用节点流进行输入/输出并添加附加功能
过滤流的构造方式是以其他流位参数构造(这样的设计模式称为装饰模式)。Java 的IO流使用装饰器模式, 将IO流分成底层节点流和上层处理流。其中节点流用于和底层的物理存储节点直接关联。过滤流是连接在已存在的流之上, 通过对数据的处理为程序提供更为强大的读与功能。
注意
I/O流是一类很宝贵的资源,使用完必须调用close()
方法关闭流冰释放资源。在关闭流时,只用关闭最外层的流