Buffer即緩沖區,是包含有一定量數據的容器。Buffer的工作和Channel有著緊密的聯系。Channel是I/O的出入口,buffer就是IO的來源或者目標。
要向外傳輸數據,把數據存放在buffer中交給channel
要接受數據,提供buffer讓channel寫入。
Buffer的類圖.jpg
Capacity
Buffer可以包含的最大字節數。當Buffer創建的時候,容量被設置而且不可更改
Limit
Buffer中的第一個元素,這個元素不應該被讀或者是被寫。包含著在buffer中“存活”的數據個數
Position
下一個被操作的數據的位置。put和get操作會更新position的位置
Mark
一個有記憶的位置,設置了mark,之后可以回退到標記點,重新進行操作。
新創建一個大小為10的Buffer,概念中可以理解成是這樣的
EFFF51B75F4A39C60F13BE7E9D517BFA.jpg
下面是Buffer的方法簽名
public abstract class Buffer{
public final int capacity()
public final int position()
public final Buffer position (int newPosition)
public final int limit ()
public final Buffer limit(int newLimit)
public final Buffer mark()
public final Buffer reset()
public final Buffer clear()
public final Buffer flip()
public final Buffer rewind()
public final int remaining()
public final boolean hasRemaining();
public abstract boolean isReadOnly();
}
你可能會覺得有一些方法應該返回空值,但是卻返回了buffer對象,這是為了構建一個流式的API。比如像這樣的代碼
buffer.mark();
buffer.position(5);
buffer.reset()
//就可以寫成下面這樣
buffer.mark().position(5).reset();
所有的buffer都是可讀的,但并不是所有的buffer都支持寫操作,通過isReadOnly方法判斷是否可以寫,如果你試圖向不支持寫操作的buffer中寫入數據,會拋出ReadOnlyBufferException異常。