一个Buffer是一个固定数量的数据容器。其作用是一个存储器,或者分段运输区,在这里数据可被存储并在之后用于检索,对于每个非boolean原始数据类型都有一个缓冲区。尽管缓冲区作用于他们存储的原始数据类型,但缓冲区十分倾向于处理字节。非字节缓冲区可以在后台执行从字节或到字节的转换,缓冲区的工作与通道紧密联系。通道是I/O传输发生时通过的入口,而缓冲区是这些数据传输的来源或目标。对于离开缓冲区的传输,您想离开缓冲区的传输,您想传递出去的数据被置于一个缓冲区,被传送到通道。对于传回缓冲区的传输,一个通道将数据放置在您所提供的缓冲区中。这种在协同对象之间进行的缓冲区数据传递是高效数据处理的关键。
缓冲区基础:
1.属性
所有的缓冲区都具有四个属性来提供关于其所包含的数据元素的信息。他们是:
容量(capacity)
缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定,并且永远不能被改变。
上界(limit)
缓冲区的第一个不能被读或者写的元素。或者说,缓冲区中现存元素的计数。
位置(position)
下一个要被读或写的元素的索引。位置会自动由响应的get()和put()函数更新。
标记(mark)
一个备忘位置。调用mark()来设定mark = position,调用reset()设定position= mark。标记在设定前是未定义的。
这四个属性关系如下:
0<=mark<=position<=limit<=capacity
2.实际使用中的例子:
当新创建一个容量为10的缓冲区的时候,其逻辑视图如下:
位置(position)被设置为0,上界和容量(capacity)都为10,其中capacity是固定不变的,其他三个都可以根据需要操作变动,
mark()方法用来记录备忘位置,设置mark = position,
reset()设置position = mark ,
flip() 方法 源码如下:
public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}
put() position+1
get() position + 1
hasRemaining()方法,判断是否到达上界
public final boolean hasRemaining() {
return position < limit;
}