标签:核心 wrap RKE cep 获取数据 数组初始化 math 状态 也会
IntBuffer
⑴ 静态方法 allocate:初始化一个指定容量的缓存区
解释一下图例:
1.数组下标:数字(1,2,3,4,5)表示数组下标
1.数组:灰色长方形内表示真实有效的数组。
2.数组元素:数字所在的白色黑边正方形表示数组元素,可以通过例如 array[0] 来获取数组元素。但是注意,图中没有明确指定数组元素的值是什么。
3.虚拟下标:其中-1
和6
是虚拟的下标位置,如果使用这2个下标取值( array[-1] 或者 array[6] )会抛出 IndexOutOfBoundsException
⑵ 静态方法 wrap:把一个数组初始化成一个缓存区
array
作为 wrap 的参数,那么效果和 allocate 类似。但是,修改数组中的值,等同于修改缓存区的值。array
外,还有 offset
和 length
来指定子数组的开始位置和子数组的大小。效果如下图:array
put()
填充一个新的元素到数组中get()
获取当前位置的元素由写模式 转换为> 读模式
注意:
虽然,flip 的中文含义是 “翻动”,但是连续调用 flip 不能实现 写模式 -> 读模式 -> 写模式!
连续调用 flip 之后,postion == limit == 0。
因此,继续调用 get() 会抛出 读取超限 BufferUnderflowException ,调用 put() 会抛出 写入超限 BufferOverflowException
重新回到初始化状态,重新进入写模式
注意
clear 实际并不会清理数据,而是调整 limit、position、mark 指向的位置
使用场景
替换一段内容:添加标记,以便后续调用 reset() 将 position 回到标记。
注意
mark < 0
抛出无效标记异常。说明必须要先 mark() 才能调用 reset()其中,
remaining 表示剩余空间大小。hasRemaining() 用来查询是否还有剩余空间。
get
读取数据时,如果 position >= limit
,抛出 BufferUnderflowException 异常put
写入数据时,如果 position >= limit
,抛出 BufferOverflowException 异常注意
如果是使用 wrap 初始化的缓冲区,即使没有到达容器容量 capacity
,也会报错,因为此时 limit < capacity
position >= limit
。即 如果进行接下来的读或者写操作,当前位置都将超过限制。标签:核心 wrap RKE cep 获取数据 数组初始化 math 状态 也会
原文地址:https://www.cnblogs.com/kendoziyu/p/java-nio-buffer.html