JAVA NIO(一):Buffer.mark()的用法

来源:互联网 发布:三菱中性笔 知乎 编辑:程序博客网 时间:2024/06/04 19:50

在默认情况下,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();
原创粉丝点击