在默認情況下,Buffer.mark()並沒有什么用處,既不會影響Buffer的遍歷,也不會影響Buffer的位置統計函數,如remaining()函數,能影響這些操作的行為只有position()。
位置統計示例代碼如下:
CharBuffer buffer = CharBuffer.allocate(10); buffer.put('你'); buffer.put('好'); // 直接跳轉位置 buffer.position(5); // 現在剩余的緩沖區只有5了 assertThat(buffer.remaining(), IsEqual.equalTo(5));
位置遍歷的代碼如下:
CharBuffer buffer = CharBuffer.allocate(10); buffer.put('你'); buffer.put('好'); // 不需要mark也可進行遍歷, buffer.position(0); // 遍歷數據 while(buffer.hasRemaining()) { System.out.println(buffer.get()); }
從上面的兩端代碼可以看出,無論是遍歷還是位置統計都不需要mark()操作,但結合使用reset(),mark()就可以大顯身手了:
CharBuffer buffer = CharBuffer.allocate(10); buffer.put('你'); buffer.put('好'); // 經過標記后,會持續記住此位置 buffer.position(0).mark(); while(buffer.hasRemaining()) { System.out.println(buffer.get()); // mark將會跳轉到上次標記的位置 buffer.reset(); }
所以上述的程序將會持續輸出“你”字,並進入無窮循環。
總結
把Buffer的函數整理一下,我們發現很多函數都提供了類似的功能,如:
# 回到第0個位置並標記 buffer.position(0).mark(); # 與上述函數的簡潔寫法 buffer.flip(); # 在0位置進行標記,reset也能達到類似的效果 buffer.reset();