• 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();
  • 相关阅读:
    Python 文件Hash(MD5,SHA1)
    CDHtmlDialog探索Javascript与窗体交互
    C++ 实现不允许继承的类
    (一)JDBC入门及简介
    (二)JDBC 连接数据库
    2012年,总结
    canvas 时钟
    解决数据库日志文件过满的又一方法
    Windows XP 注册表修改大全
    windows2003中安装.netframework1.1
  • 原文地址:https://www.cnblogs.com/qiumingcheng/p/9486925.html
Copyright © 2020-2023  润新知