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