java Buffer虚拟类

总结

  1. Buffer是用于存储特定基元类型数据的容器,除内容外,缓冲区Buffer的基本属性是其容量capacity、限制limit和位置position
  2. 缓冲区的容量capacity是它包含的元素数。这个缓冲区的容量永远不会为负值,也不会发生变化。缓冲区的限制limit应该是第一个不能读或写元素的索引,缓冲区的限制永远不会为负,也永远不会为零或大于其容量。 缓冲区的位置position是下一个要读或写元素的索引,缓冲器的位置从不为负,也从不为负或超过它的限制limit
  3. mark(标记) <= position(位置) <= limit (限制)<= capacity(容量)
  4. clear()方法使缓冲区为新的数据序列做好准备通道读取或相对put(写当前position位置)操作,它将限制设置为容量和位置为零,读取新的数据序列应当从头开始读取
  5. flip()方法使缓冲区为新的通道写入或相对get(读当前position位置)操作,它将限制设置为当前位置,然后将该位置设置为零,新的数据写入不应当覆盖我们之前未读取的数据,所以将限制设为当前位置
  6. rewind()方法使缓冲区准备好重新读取需要的数据,它保持限制不变并设置位置归零
  7. 多个并发线程使用缓冲区是不安全的。如果一个缓冲区要由多个线程使用,那么应该通过适当的同步来控制对缓冲区的访问

Buffer的final方法

方法名作用
final int capacity()返回此缓冲区的容量
final int position()返回此缓冲区的位置
final Buffer position(int newPosition)设置此缓冲区的位置。如果标记mark已定义且大于新位置,则该标记将被丢弃
final int limit()返回此缓冲区的限制
final Buffer limit(int newLimit)设置此缓冲区的限制,如果位置position大于新限制,则设置为新限制,如果标记已定义且大于新限制,则该标记将被丢弃
final Buffer mark()将此缓冲区的标记mark设置在当前位置position
final Buffer reset()将此缓冲区的位置position重置为先前标记的位置mark
final Buffer clear()清除此缓冲区,位置position设置为零,限制limit设置为容量capacity,标记mark被丢弃
final Buffer flip()翻转此缓冲区,将限制limit设置为当前位置,然后将该位置position设置为零,如果定义了标记mark,则该标记将被丢弃
final Buffer rewind()倒带(磁带倒带)这个缓冲区,位置position设置为零,标记被丢弃,相当于从头开始读或从来开始写
final int remaining()返回当前位置position和限制limit之间的元素数,即还有多少元素需要被写,或者还有多少元素需要读
final boolean hasRemaining()判断当前位置和限制之间是否存在任何元素

Buffer的abstract方法(子类需要实现的方法)

方法名作用
abstract boolean isReadOnly()指示此缓冲区是否为只读
abstract boolean hasArray()说明此缓冲区是否由可访问数组支持
abstract Object array()返回支持此缓冲区的数组(可选操作)
abstract int arrayOffset()返回缓冲区第一个元素在此缓冲区的备份数组中的偏移量(可选操作)
abstract boolean isDirect()判断此缓冲区是否为直接缓冲区

Buffer的用于边界检查的包私有方法方法

方法名作用
final int nextGetIndex()先检查当前位置超出限制,如果没有超出限制,获取当前位置position,并将position加1,超出限制抛出异常
final int nextGetIndex(int nb)先检查剩余元素个数是否大于nb,如果大于,获取当前位置position,并将position加nb,否则抛出异常
final int nextPutIndex()和nextGetIndex()类似,只不过nextGetIndex()是用于读,nextPutIndex()是用于写
final int nextPutIndex(int nb)和nextGetIndex(int nb)类似,只不过nextGetIndex(int nb)是用于读,nextPutIndex(int nb)是用于写
final int checkIndex(int i)根据限制检查给定索引 i,如果不小于限制或小于零,则抛出IndexOutOfBoundsException
final int checkIndex(int i, int nb)i是索引,nb是要获取索引后多长的数据,检查i + nb是否会大于limit,大于抛异常
final int markValue()返回标记mark
final void truncate()初始化,标记mark设为-1,位置position,限制limit,容量capacity全部设为0
final void discardMark()丢弃标记,将标记mark设为-1
static void checkBounds(int off, int len, int size)检查从偏移量off开始的len长度的范围会不会超出size
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lolxxs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值