zoukankan      html  css  js  c++  java
  • NIO 缓冲区Buffer (一)

    缓冲区几个基本概念:

    position, 当前位置属性

    limit, 上界属性, put()/get() 时索引位置不允许超过上界值, put()超过上界则抛出BufferOverflowException(溢出), get() 超过上界则抛出BufferUnderflowException(暗流)

    capacity, 缓冲区总容量.

    mark, 保存的位置值, 通过mark() 设置, 设置之后可以通过reset()返回到这个位置

    mark <= position <= limit <= capacity

    API:

    position(int index)  设置position值为index

    position()      返回Buffer的position

    limit(int index)    设置limit属性值为index

    limit()        返回Buffer的limit

    capacity()      返回Buffer的capacity

    读取, 释放

    get()      position是相对的, 每次返回值时缓冲区position属性的值加1, 可以读取当前position到limit之间的数据

    get(int index)  position是绝对的, 但不会影响缓冲区position属性的值, 可以读取limit之内的数据

    hasRemaining()  返回是否达到缓冲区的上界, position<limit

    remaining()    返回当前位置到上界还剩余的元素数目. limit-position

    填充

    put()      position是相对的, 每次调用时position属性自动加1, position不能越过limit

    put(int index, byte b) position是绝对的, 但不会影响缓冲区position属性的值

    翻转

    flip()      设置limit=position, mark=-1, position=0, 以便可以从头开始操作, (是buffer.limit(buffer.position()).position(0)的简便写法), 连续两次调用flip()会致使position=0 limit=0

    clear()     重置缓冲区为空状态, 其实并不改变缓冲区中的任何元素, limit=capacity, position=0, mark=-1

    rewind()    可以只用rewind()后退, 重读已经被翻转的缓冲区中的数据.position=0, mark=-1

    压缩

    compact()     压缩Buffer, 并使得缓冲区对写入数据准备就绪, 其作用是丢弃已经释放的数据(读取过的)并保留未释放的数据,  将未释放的数据移到开始位置, position设为剩余数据的长度, limit设为最大值(即limit=capacity), 如果想在压缩后释放数据, 则仍旧需要翻转buffer.flip().

    buf.clear();          // Prepare buffer for use
    while (in.read(buf) >= 0 || buf.position != 0) {
      buf.flip();
      out.write(buf);
      buf.compact();    // In case of partial write
    }

    标记缓冲区

    mark()     保存当前位置, 以备后面返回到这个点.

    reset()     设置position为之前mark的位置.

    isReadOnly()  所有缓冲区都是可读的, 但并不是所有缓冲区都可写, 例如对一个只读视图缓冲区的修改都会导致ReadOnlyBufferException抛出.

  • 相关阅读:
    Linux08:帮助与常用快捷键
    Android : 跟我学Binder --- (5) C++实现
    Linux应用调试 :使用gdb和gdbserver进行远程调试
    Mosquitto-1.5在Linux上的安装以及Android客户端的实现
    MySQL-8.0.15在Win10和Ubuntu上安装&使用
    Android : 跟我学Binder --- (4) 驱动情景分析
    Android : Android Studio 更新至gradle 4.10.1后Variants API变化
    Android : 跟我学Binder --- (3) C程序示例
    Android : 关于HTTPS、TLS/SSL认证以及客户端证书导入方法
    Android : 跟我学Binder --- (2) AIDL分析及手动实现
  • 原文地址:https://www.cnblogs.com/davidwang/p/3656949.html
Copyright © 2011-2022 走看看