IO思维导图
关于BIO
BIO一些关键词
字节流前缀 | 字符流前缀 | 说明 |
---|---|---|
File | File | 目标为文件 |
ByteArray | CharArray | 目标为字节/字符数组 |
Piped | Piped | 目标为管道 |
Buffered | Buffered | 增加缓冲区 |
Pushback | Pushback | 增加回退操作 |
Object | Object | 能够操作自定义对象 |
Data | - | 能够操作基本java数据类型 |
增加打印功能 | ||
- | String | 目标为字符串 |
- | LineNumber | 增加行数功能 |
- | OutputStream/InputStream | 能够将字节流转字符流 |
NIO,BIO,AIO有什么区别
BIO 同步,堵塞,针对流
NIO 同步,非堵塞,针对缓冲区
AIO 异步,非堵塞,基于回调
关于NIO
Channel+Buffer实现NIO
- 获得管道
- 创建缓冲区
- 调用channel.read从管道读数据到缓冲区
- 调用buffer.flip转缓冲区读模式
- 关闭通道
selector如何使用
- Selector.open()创建选择器
- channel.register()注册到选择器上
- 非堵塞方式实现不同事件的处理逻辑
IO多路复用
很多个网络I/O复用一个或少量的线程来处理这些连接
IO多路复用技术区别
select
- select能监控的描述符个数由内核中的FD_SETSIZE限制。
- 每次调用select都会线性扫描所有描述符的状态。
- 每次调用select都要在用户空间和内核空间里进行内存复制fd描述符等信息。
poll
- poll使用链表结构来存储fd,突破了select中描述符数目的限制。
- 每次调用poll都会线性扫描所有描述符的状态。
- 每次调用poll都要在用户空间和内核空间里进行内存复制fd描述符等信息。
epoll
- epoll使用链表结构来存储FD,因此维护的描述符数目不受到限制。
- epoll维护着就绪队列,在描述符读写就绪时,会通过回调函数将自己加入就绪队列中,因此epoll无须遍历所有的FD,时间复杂度仅和活跃的客户端数相关
- epoll在传递内核与用户空间的消息时使用了内存共享,而不是内存拷贝,这也使得epoll的效率比poll和select更高。