JAVA的IO演进
-
jdk1.0到jdk1.3,只提供BIO
-
jdk1.4新增java.nio包,提供了NIO开发的API和类库,主要类和接口:
- 进行异步I/O操作的缓冲区ByteBuffer等
- 进行异步I/O操作的管道Pipe
- 进行各种I/O(异步或同步)的Channel,包括ServerSocketChannel和SocketChannel
- 多种字符集的编码能力和解码能力
- 实现非阻塞I/O操作的多路复用器selector
- 基于流行的Perl实现的正则表达式类库
- 文件通道FileChannel
-
jdk1.7将原来的NIO类库升级,主要改进三个方面:
- 提供能够批量获取文件属性的API,这些API具有与平台无关性,不与特性文件系统相耦合
- 提供AIO功能,支持基于文件的异步I/O操作和针对网络套接字的异步操作
- 完成通道功能,包括对配置和多播数据报的支持
阻塞(Block)和非阻塞(Non-Block)
阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候。
- 阻塞:往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。
- 非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回。
同步(Synchronization)和异步(Asynchronous)
同步和异步都是基于应用程序和操作系统处理 IO 事件所采用的方式。比如同步:是应用程序要直接参与 IO 读写
的操作。异步:所有的 IO 读写交给操作系统去处理,应用程序只需要等待通知。
- 同步方式在处理 IO 事件的时候,必须阻塞在某个方法上面等待我们的 IO 事件完成(阻塞 IO 事件或者通过轮询 IO事件的方式)
- 对于异步来说,所有的 IO 读写都交给了操作系统。这个时候,我们可以去做其他的事情,并不需要去完成真正的 IO 操作,当操作完成 IO 后,会给我们的应用程序一个通知。
BIO
NIO
AIO
各 IO 模型对比与总结
属性 | 同步阻塞 IO(BIO) | 伪异步 IO | 非阻塞 IO(NIO) | 异步 IO(AIO) |
---|---|---|---|---|
客户端数:IO 线程数 | 1:1 | M:N(M>=N) | M:1 | M:0 |
阻塞类型 | 阻塞 | 阻塞 | 非阻塞 | 非阻塞 |
同步 | 同步 | 同步 | 同步(多路复用) | 异步 |
API 使用难度 | 简单 | 简单 | 复杂 | 一般 |
调试难度 | 简单 | 简单 | 复杂 | 复杂 |
可靠性 | 非常差 | 差 | 高 | 高 |
吞吐量 | 低 | 中 | 高 | 高 |