一、缓冲区简介
Nio中的 Buffer 是用于存储特定基础类型的一个容器。为了能熟练的使用 Nio中的各种 Buffer , 我们需要理解 Buffer 中的 三个重要 的属性。
-
capacity
:表示的是这个缓冲区包含元素的个数,容量不可改变也不可是负数 -
limit
:表示的是缓冲区中第一个不可
读或写的元素的索引
,它不可是负数并且 <= capacity -
position
:表示的是缓冲区中下一个元素可
读或可写的元素的索引
,它不可是负数并且 <= limit
0 <= position <= limit <= capacity
二、相对操作和绝对操作
相对操作:相对的读或写操作,会根据读取或写入元素的个数会直接修改Buffer 中的 position
的值,比如:buffer.get()
绝对操作:直接根据索引进行操作,不会修改 Buffer 中的 position
的值,比如: buffer.get(索引)。
即:直接根据索引来进行操作的是绝对操作,否则是相对操作。
三、这篇文章中用到的buffer的方法
buffer.put(数据)
===> 向 buffer 中写入数据
buffer.get()
===> 从 buffer 中获取数据
buffer.get(索引)
===> 绝对操作,获取buffer中这个索引所处于的数据,不会修改 position
的值
buffer.flip()
===> 将 buffer 从写入操作转换成 读取操作
buffer.clear()
===> 将buffer 从读取操作转换成写入操作,注意:
这个时候buffer中的数据并不会删除,只是修改了 position 、limit、和 mark 的值
四、Buffer 具体操作的实例
分布详解上图中1 2 3 4各步骤中 position、 limit、和 capacity的变化
1、 分配一个新的 IntBuffer
2、 往 IntBuffer 中写入数据
往buffer中写入数据时,会修改
position
的值,写入的 position <= limit
,因为limit为下一个不可读或写元素的索引。3、 转换成读模式
4、 获取数据
即:
1、容量 capcaity
总是不可进行修改的。
2、数据的读取或写入的会修改 position
的值,但是不会修改 limit
的值 并且 position <= limit
3、当写模式变成读模式时需要调用 flip()
方法
4、limit
总是指向缓冲区中的第一个不可读取或写入元素的索引