IO模型简介
IO的概念
IO一般指读与写这两种操作,涉及到数据流的传输与转换。
java将不同的数据源的交互统称为流(stream),根据流向不同分为:输入流、输出流两种。
java传统的流类型统一放在java.io这个包下。
java中流操作的基类
java的输入流主要是InputStream和Reader作为基类,而输出流则是主要由outputStream和Writer作为基类。它们都是一些抽象基类,无法直接创建实例。
根据流的单位不同,划分为字节(8字节)流和字符(16字节)流,字节流对应:InputStream/OutputStream,字符流对应:Reader/Writer。
java流操作带来的好处
java中一个流可以看成一段稳定的水管,一个字节或字符可以看做水管中流动的水滴,配合java中多样的流类型,可以提供稳定可缓存的,简易操作的流功能。
IO的各种模式
IO操作,最少会涉及到两个对象:调起IO的进程 + 系统的内核。
一个IO读操作有两个阶段:
- 进程等待数据准备
- 将数据由内核拷贝到进程
为了解决IO耗时的问题,提出多种网络IO模型:阻塞IO模型、非阻塞IO模型、多路复用IO模型、异步IO模型。
阻塞IO模型
进程调起一个IO操作,需要等待系统内核返回数据才会继续进程之后的操作。再内核返回数据之前,进程处于阻塞状态。
非阻塞IO模型
进程调起一个IO操作,立即得到返回结果,如果结果失败,则再次调起访问,直到系统内核返回数据为止。适用于哪些场景?
多路复用IO模型(异步阻塞IO模型)
多路IO复用,也可称为事件驱动IO(Reactor设计模式),原理是有个函数不断轮询Socket,当某个Stocket有数据返回了,就通知进程中的调用方进行处理,该模式主要适用于多个连接调用,对其中一个进程调用来说,跟阻塞IO模式没有区别。
异步IO模型
异步IO,其实就是进程调用会立刻得到结果返回,进程可以继续往下执行,当系统内核准备好数据后,通知进程,进程再处理数据。
IO在网络传输中的应用(待补充)
关于学习到的一些记录与知识总结