NIO 緩衝區Buffer (一)

緩衝區幾個基本概念:

position, 當前位置屬性spa

limit, 上界屬性, put()/get() 時索引位置不容許超過上界值, put()超過上界則拋出BufferOverflowException(溢出), get() 超過上界則拋出BufferUnderflowException(暗流)code

capacity, 緩衝區總容量.blog

mark, 保存的位置值, 經過mark() 設置, 設置以後能夠經過reset()返回到這個位置索引

mark <= position <= limit <= capacityip

 

 

API:

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拋出.

相關文章
相關標籤/搜索