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