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的数据,