nio buffer 学习详解

1. Buffer

nio对于原生数据类型的支持(除去boolean)
如 IntBuffer、ByteBuffer

2. buffer重要概念

buffer中有一个概念是关于 position、limit 、capacity 的
在一个buffer被初始化的时候,比如 intBuffer.allocate(6),我们给当前buffer分配控件为6
这个时候,position 指向 0 ,limit = capacity 指向当前容量的下一个地址 即 7 
如下图: 

这时候我们向buffer中写入3个控件的数据,position 指向4(下一个将要下入的空间),limit = capacity 指向当前容量的下一个地址 为 7

此时调用buffer.flip 进行翻转 准备输出。 position指向0,
limit指向4,capacity指向7

buffer.clear 置为初始状态

3. sliceBuffer

通过 buffer.slice获取一个新的buffer,新buffer以 buffer的position为开始,以buffer的limit为结束返回。
新buffer的position,limit,capacity 独立,但是对于新buffer的修改会反映到原有的buffer中

4. 只读buffer

通过buffer.asReadOnlyBuffer()获取.
如果尝试向只读buffer写入数据会抛出异常ReadOnlyException,原有buffer的数据变化对于只读buffer是可见的

5. directBuffer 直接缓冲

通过byteBuffer.allocateDirect()获取.
堆外内存,0 拷贝,直接在native创建内存区域同io设备打交道

6. buffer的scattering和gathering

Scaterring 撒开,分散,将来自于一个Channel的数据分散到多个Buffer当中,一个满了就用下一个,可以实现数据的分门别类.

这样就省去了解析的时间,比如一个消息有三个部分,第一部分是头信息,第二部分是协议信息,第三部分是消息体.

可以吧这三个消息分别放到不同的Buffer当中,

Gatering 把多个汇总成一个,将要写到Channel的数据,