position, 當前位置屬性spa
limit, 上界屬性, put()/get() 時索引位置不容許超過上界值, put()超過上界則拋出BufferOverflowException(溢出), get() 超過上界則拋出BufferUnderflowException(暗流)code
capacity, 緩衝區總容量.blog
mark, 保存的位置值, 經過mark() 設置, 設置以後能夠經過reset()返回到這個位置索引
mark <= position <= limit <= capacityip
position(int index) 設置position值爲indexci
position() 返回Buffer的positionrem
limit(int index) 設置limit屬性值爲indexget
limit() 返回Buffer的limitit
capacity() 返回Buffer的capacityio
get() position是相對的, 每次返回值時緩衝區position屬性的值加1, 能夠讀取當前position到limit之間的數據
get(int index) position是絕對的, 但不會影響緩衝區position屬性的值, 能夠讀取limit以內的數據
hasRemaining() 返回是否達到緩衝區的上界, position<limit
remaining() 返回當前位置到上界還剩餘的元素數目. limit-position
put() position是相對的, 每次調用時position屬性自動加1, position不能越過limit
put(int index, byte b) position是絕對的, 但不會影響緩衝區position屬性的值
flip() 設置limit=position, mark=-1, position=0, 以即可以從頭開始操做, (是buffer.limit(buffer.position()).position(0)的簡便寫法), 連續兩次調用flip()會導致position=0 limit=0
clear() 重置緩衝區爲空狀態, 其實並不改變緩衝區中的任何元素, limit=capacity, position=0, mark=-1
rewind() 能夠只用rewind()後退, 重讀已經被翻轉的緩衝區中的數據.position=0, mark=-1
compact() 壓縮Buffer, 並使得緩衝區對寫入數據準備就緒, 其做用是丟棄已經釋放的數據(讀取過的)並保留未釋放的數據, 將未釋放的數據移到開始位置, position設爲剩餘數據的長度, limit設爲最大值(即limit=capacity), 若是想在壓縮後釋放數據, 則仍舊須要翻轉buffer.flip().
buf.clear(); // Prepare buffer for use while (in.read(buf) >= 0 || buf.position != 0) { buf.flip(); out.write(buf); buf.compact(); // In case of partial write }
mark() 保存當前位置, 以備後面返回到這個點.
reset() 設置position爲以前mark的位置.
isReadOnly() 全部緩衝區都是可讀的, 但並非全部緩衝區均可寫, 例如對一個只讀視圖緩衝區的修改都會致使ReadOnlyBufferException拋出.