JAVA NIO:Buffer.mark()的用法


在默認情況下,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();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM