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