• BtyeBuffer


    https://blog.csdn.net/ZYC88888/article/details/80228531 (牛)

    ByteBuffer的扩展

    HeapByteBuffer 和 DirectByteBuffer

     
    Bytebuffer UML图
    -描述优点
    HeapByteBuffer 在jvm堆上面的一个buffer,底层的本质是一个数组 由于内容维护在jvm里,所以把内容写进buffer里速度会快些;并且,可以更容易回收
    DirectByteBuffer 底层的数据其实是维护在操作系统的内存中,而不是jvm里,DirectByteBuffer里维护了一个引用address指向了数据,从而操作数据 跟外设(IO设备)打交道时会快很多,因为外设读取jvm堆里的数据时,不是直接读取的,而是把jvm里的数据读到一个内存块里,再在这个块里读取的,如果使用DirectByteBuffer,则可以省去这一步,实现zero copy

    ByteBuffer的属性及方法

    ByteBuffer的属性
    1      byte[] buff  //buff即内部用于缓存的数组。
    2      position //当前读取的位置。
    3      mark //为某一读过的位置做标记,便于某些时候回退到该位置。
    4      capacity //初始化时候的容量。
    5      limit //当写数据到buffer中时,limit一般和capacity相等,当读数据时,limit代表buffer中有效数据的长度。

    4个指针的涵义

    position:位置指针。微观上,指向底层字节数组byte[] hb的某个索引位置;宏观上,是ByteBuffer的操作位置,如get()完成后,position指向当前(取出)元素的下一位,put()方法执行完成后,position指向当前(存入)元素的下一位;它是核心位置指针。

    mark标记:保存某个时刻的position指针的值,通过调用mark()实现;当mark被置为负值时,表示废弃标记。

    capacity容量:表示ByteBuffer的总长度/总容量,也即底层字节数组byte[] hb的容量,一般不可变,用于读取。

    limit界限:也是位置指针,表示待操作数据的界限,它总是和读取或存入操作相关联,limit指针可以被  改变,可以认为limit<=capacity


     

    这些属性总是满足以下条件:
      0 <= mark <= position <= limit <= capacity

    ByteBuffer的常规方法
    1  ByteBuffer allocate(int capacity) //创建一个指定capacity的ByteBuffer。
    2      ByteBuffer allocateDirect(int capacity) //创建一个direct的ByteBuffer,这样的ByteBuffer在参与IO操作时性能会更好
    3      ByteBuffer wrap(byte [] array)
    4      ByteBuffer wrap(byte [] array, int offset, int length) //把一个byte数组或byte数组的一部分包装成ByteBuffer。
    5      //get put方法不多说
    6      byte get(int index)
    7      ByteBuffer put(byte b)
    8      int getInt()             //从ByteBuffer中读出一个int值。
    9      ByteBuffer putInt(int value)  // 写入一个int值到ByteBuffer中。
    ByteBuffer的特殊方法
    1      Buffer clear()    把position设为0,把limit设为capacity,一般在把数据写入Buffer前调用。
    2      Buffer flip()    把limit设为当前position,把position设为0,一般在从Buffer读出数据前调用。
    3      Buffer rewind()  把position设为0,limit不变,一般在把数据重写入Buffer前调用。
    4      compact()       将 position 与 limit之间的数据复制到buffer的开始位置,复制后 position = limit -position,limit = capacity, 但如         果position 与limit 之间没有数据的话发,就不会进行复制。
    5      mark() & reset()     通过调用Buffer.mark()方法,可以标记Buffer中的一个特定position。之后可以通过调用Buffer.reset()方法恢复到这个position。
    图解ByteBuffer方法改变属性

    put
    写模式下,往buffer里写一个字节,并把postion移动一位。写模式下,一般limit与capacity相等。
    flip
    写完数据,需要开始读的时候,将postion复位到0,并将limit设为当前postion。
    get
    从buffer里读一个字节,并把postion移动一位。上限是limit,即写入数据的最后位置。
    clear
    将position置为0,并不清除buffer内容。
    mark & reset
    mark相关的方法主要是mark()(标记)和reset()(回到标记).







  • 相关阅读:
    POJ
    归并排序+归并排序求逆序对(例题P1908)
    HDU
    2018-12-5 及 codeforces round 525v2
    2018-12-1学习纪录
    近期总结和未来规划
    C++ storage allocation + Dynamic memory allocation + setting limits + initializer list (1)
    注意项
    第四课 计算机的基本组成
    第二课+第三课 计算机系统概论
  • 原文地址:https://www.cnblogs.com/lhh-boke/p/13876861.html
Copyright © 2020-2023  润新知