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();
posted @ 2018-08-16 14:07  邱明成  阅读(2420)  评论(0编辑  收藏  举报