zoukankan      html  css  js  c++  java
  • byteBuffer, clear(), flip(), rewind(), allocate(), allocateDirect()

     【慎用allocateDirect】

    http://blog.csdn.net/rocketball/article/details/5849033

    http://618119.com/archives/2008/03/08/74.html

     

    【不变式】

    下面的不变式持有标记、位置、限制和容量值:

    0 <= 标记 <= 位置 <= 限制 <= 容量
    1.  标记,mark
    2. 位置,position
    3. 限制,limit
    4. 容量,capacity

    【读写】

    • 基本类型

     除boolean型外,char/int/short/long/float/double等,都提供了get/put方法,用于向ByteBuffer进行读写;

    • 写入顺序

    order()获取字节写入顺序,order(ByteOrder)可设置写入顺序;

    • 相对/绝对位置

    读写时,可从默认位置处进行,也可指定offset与lenth。例如,put(byte[]); put(byte[], offset); put(byte[], offset, length); get与之类似。

    • 视图

    对ByteBuffer可建立基本类型视图,char/int/short/long/float/double,asFloatBuffer(), 这样的视图可读写同类元素;

    【常用操作】

    .slice(),创建新的字节缓冲区,其内容是此缓冲区内容的共享子序列。新缓冲区的内容将从此缓冲区的当前位置开始。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓冲区的位置、界限和标记值是相互独立的。新缓冲区的position将为零,其capacity和limit将为此缓冲区中所剩余的字节数量,其标记是不确定的。

    .duplicate(), 创建共享此缓冲区内容的新的字节缓冲区。新缓冲区的内容将为此缓冲区的内容。此缓冲区内容的更改在新缓冲区中是可见的,反之亦然;这两个缓冲区的位置、界限和标记值是相互独立的。新缓冲区的容量、界限、位置和标记值将与此缓冲区相同。

    .compact(), 将缓冲区的当前位置和界限之间的字节(如果有)复制到缓冲区的开始处。

     

    ================================================================

     

    .mark(), 在此缓冲区的位置设置其标记。

    .reset(), 将此缓冲区的位置重新设置成以前标记的位置,调用此方法既不会更改也不会丢弃标记的值。

    • 缓冲区的标记是在调用reset()方法时其位置将被重置的索引。并不是总要定义标记.
    • 但是,在定义标记时,永远不要将其定义为负数,并且永远不要大于其位置。
    • 如果定义了标记,则在位置或限制调整为小于标记的值时,该标记将被丢弃。如果未定义标记,则调用reset()方法将导致抛出 InvalidMarkException


    ================================================================

     

    .clear(),清除此缓冲区,position = 0,limit=capacity,并且丢弃标记。此方法不能实际擦除缓冲区中的数据,但从名称来看似乎能够擦除,因为它多数情况下确实是在擦除数据时使用的。

    .flip(),反转此缓冲区。limit=position, position=0,如果已定义了标记,则丢弃该标记。将数据从一个地方传输到另一个地方时,经常将此方法与 compact 方法一起使用。

    .rewind(), 重绕此缓冲区,将位置设置为零并丢弃标记。


    ================================================================

     

    • clear(), flip(), rewind()方法很重要,释义如下:

     

    ByteBuffer 准备Buffer以实现 Position Limit Mark
    .clear 将数据read()/put()进缓冲区 0 capacity 未定义
    .flip 从缓冲区write()/get() 0 position 未定义
    .rewind 从缓冲区rewrite()/get() 0 unchanged 未定义
  • 相关阅读:
    错误解决mysql
    (一)熟悉执行流程——基于ThinkPHP3.2的内容管理框架OneThink学习
    版权控制之zend guard 6.0使用教程
    IP进制站群原理
    多线程更新已排序的Datagridview数据,造成数据错位
    压缩html 减小存储空间
    DataGridView导入导出excel
    软件下载目录
    java反射
    JTA
  • 原文地址:https://www.cnblogs.com/alipayhutu/p/2491732.html
Copyright © 2011-2022 走看看