39 lines
1.9 KiB
Markdown
39 lines
1.9 KiB
Markdown
# NIO
|
||
## 简介
|
||
nio库在jdk 1.4时被引入,和传统i/o不同的是,nio性能高且基于block。在nio中,定义了类来持有数据,并以block为单位对数据进行处理。
|
||
|
||
### nio和传统io区别
|
||
nio和传统io最大的区别是数据打包和传输的方式。在传统io中,会以stream的形式来处理数据;而在nio中,数据则是以block的形式被处理。
|
||
|
||
面向stream的io系统在同一时刻只能处理1字节的数据,通常较慢。
|
||
|
||
面向block的io系统则是以block为单位处理数据,处理速度较传统io快。
|
||
|
||
## Channel/Buffer
|
||
channel和buffer是nio中的核心对象,几乎在每个io操作中被使用。
|
||
|
||
channel类似于传统io中的stream,所有数据的写入或读取都需要通过channel。而buffer本质上则是数据的容器,`所有被发送到channel中的数据都要先被放置到buffer中`,`所有从channel中读取的数据都要先被读取到buffer中`。
|
||
|
||
### Buffer
|
||
Buffer是一个类,用于存储数据,buffer中的数据要么将要被写入到Channel中,要么刚从Channel中读取出来。
|
||
|
||
> Buffer是nio和传统io的重要区别,在传统io中,数据直接从stream中被读取出来,也被直接写入到stream中。
|
||
>
|
||
> 在nio中,数据的读取和写入都需要经过Buffer
|
||
|
||
buffer的本质是一个字节数组,buffer提供了对数据的结构化访问,并且,buffer还追踪了系统的读/写操作。
|
||
|
||
#### Buffer类型
|
||
最常用的Buffer类型是ByteBuffer,其支持对底层的字节数据进行set/get操作,初次之外,Buffer还有其他类型。
|
||
|
||
- ByteBuffer
|
||
- CharBuffer
|
||
- ShortBuffer
|
||
- IntBuffer
|
||
- LongBuffer
|
||
- FloatBuffer
|
||
- DoubleBuffer
|
||
|
||
上述的每个Buffer类都实现了Buffer接口,除了ByteBuffer之外,其他每个Buffer类型都拥有相同的操作。由于ByteBuffer被绝大多数标准io操作锁使用,故而ByteBuffer除了拥有上述操作外,还拥有一些额外的操作。
|
||
|