1. Buffer是一种数据结构
buffer
是一种数据结构,类似于array
,其中存储的对象是基本类型,但它的访问形式不同于array
,它有一下3个属性,用于访问时使用:
property | desc |
---|---|
capacity | 表示当前buffer的最大可存放的元素个数 |
limit | 表示当前buffer中第一个不可访问的元素的索引 |
position | 表示当前buffer中下一个将要读到的元素的索引 |
使用以上3个属性就可以访问这个类array
的结构,主要作用是作为一个可复用的一块区域,将整个空间分为可用和不可用两部分
2. Buffer的子类实现规范
每个子类都要实现2种类别的get
和put
方法
-
Relative
从当前的position读取数据,读取多少数据,position将变化多少
-
Absolute
根据传入的
index
参数读取数据,不影响position
3. Mark & Reset
mark
一般与reset
成对出现的,mark
是一个标记了的index
,reset
的时候可以将position
恢复到这个特殊的index
mark
满足这样的不变式: ,当position
或者limit
变化导致设置的mark
不满足这个不变式,则此时的mark
将会丢弃
4. mark
,position
,limit
,capacity
不变式
5. 其他操作方式
method | desc | property的变化 |
---|---|---|
clear |
makes a buffer ready for a new sequence of channel-read or relative put
|
, |
flip |
makes a buffer ready for a new sequence of channel-write or relative get
|
, |
rewind |
makes a buffer ready for re-reading the data that it already contains |
code example:
clear
:
buf.clear(); // Prepare buffer for reading
in.read(buf); // Read data
flip
:
buf.put(magic); // Prepend header
in.read(buf); // Read data into rest of buffer
buf.flip(); // Flip buffer
out.write(buf); // Write header + data to channel
rewind
:
out.write(buf); // Write remaining data
buf.rewind(); // Rewind buffer
buf.get(array); // Copy data into array