NIO 三大核心组件
实现代码
重要概念 SelectionKey
limit(), limit(1 0)等
|
其中读取和设置这 4 个属性的方法的命名和 jQuery 中的val(),val(10)类似,一个负 责 get,一个负责 set
|
reset()
|
把 position 设置成 mark 的值,相当于之前做过一个标记,现在要退回到之前标记 的地方
|
clear()
|
position = 0;limit = capacity;mark = -1; 有点初始化的味道,但是并不影响底 层 byte 数组的内容
|
flip()
|
limit = position;position = 0;mark = -1; 翻转,也就是让 flip 之后的 position 到 limit 这块区域变成之前的 0 到 position 这块,翻转就是将一个处于存数据状态的缓冲区变为一个处于准备取数据的状态
|
rewind()
|
把 position 设为 0,mark 设为-1,不改变 limit 的值
|
remaining()
|
return limit - position;返回 limit 和 position 之间相对位置差
|
hasRemaining
()
|
return position < limit 返回是否还有未读内容
|
compact()
|
把从 position 到 limit 中的内容移到 0 到 limit-position 的区域内,position 和 li mit 的取值也分别变成 limit-position、capacity。如果先将 positon 设置到 limit,再 c ompact,那么相当于 clear()
|
get()
|
相对读,从 position 位置读取一个 byte,并将 position+1,为下次读写作准备
|
get(int index)
|
绝对读,读取 byteBuffer 底层的 bytes 中下标为 index 的 byte,不改变 position
|
get(byte[] dst,
int offset, int len
gth)
|
从 position 位置开始相对读,读 length 个 byte,并写入 dst 下标从 offset 到 offs et+length 的区域
|
put(byte b)
|
相对写,向 position 的位置写入一个 byte,并postion+1,为下次读写作准备
|
put(int index,
byte b)
|
绝对写,向 byteBuffer 底层的 bytes 中下标为 index 的位置插入 byte b,不改变 p osition
|
put(ByteBuffer
src)
|
用相对写,把 src 中可读的部分(也就是 position 到 limit)写入此 byteBuffer
|
put(byte[] src,
int offset, int len
gth)
|
从 src 数组中的 offset 到 offset+length 区域读取数据并使用相对写写入此 byteBu ffer
|
Linux 的 I/O 机制与 DMA