美文网首页
Java基础-Bytebuffer

Java基础-Bytebuffer

作者: 16325 | 来源:发表于2020-02-26 13:20 被阅读0次

Bytebuffer

对Bytebuffer的使用和api,这里单独记录一下。
包含三个属性:

  • capacity 缓存的容量,分配好的内存块大小,分配好后大小不可修改
  • limit 读取数据的限制。在读模式下,表示缓存的内数据大小;写模式下,表示最多可以存入数据大小,此时和capacity值相等
  • position 读取数据的位置。 表示读写的位置,下标从0开始
  • mark 标记,调用mark()来设置mark=position,再调用reset()可以让position恢复到标记的位置

方法:

  • clear:重新写入数据使用,将当前可用的第一个位置指向了buffer的首位值;
  • flip:用于读取buffer中的数据,将position置为0;
  • rewind:limit不变,position =0 ,指向了第一个位置处,用于重新读取;
  • hasRemaining() 是否还有可用的空间
  • remaining() 查看还有多少可用的空间
  • compact 将所有未读数据拷贝到Buffer起始处,丢弃已经释放的数据,保留未释放的数据,然后将position设置到最后一个未读元素的正后面

操作

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

  • put
    写模式下,往buffer里写一个字节,并把postion移动一位。写模式下,一般limit与capacity相等。

  • flip
    写完数据,需要开始读的时候,将postion复位到0,并将limit设为当前postion。

  • get
    从buffer里读一个字节,并把postion移动一位。上限是limit,即写入数据的最后位置。

  • clear
    将position置为0,并不清除buffer内容。
    此方法不能实际清除缓冲区中的数据,但从名称来看它似乎能够这样做,这样命名是因为它多数情况下确实是在清除数据时使用。因为调用该方法后,我们一般都会调用FileChannel.read(buff)或者buff.put()来把新的数据放到buff中,此时原来的内容就会被新的内容所覆盖

  • mark & reset
    mark相关的方法主要是mark()(标记)和reset()(回到标记).

  • rewind(): The position is set to zero and the mark is discarded

ByteBuffer tbuf = ByteBuffer.allocateDirect(5);
        tbuf.put((byte)0x2F);
        tbuf.put((byte)0x3F);
        tbuf.put((byte)0x4F);
        System.out.println("position:" + tbuf.position()) ;
        System.out.println("limit:" + tbuf.limit()) ;
        System.out.println("capacity:" + tbuf.capacity()) ;

        tbuf.flip();
        System.out.println("position:" + tbuf.position()) ;
        System.out.println("limit:" + tbuf.limit()) ;
        System.out.println("capacity:" + tbuf.capacity()) ;

        System.out.println( tbuf.get()) ;
        System.out.println("position:" + tbuf.position()) ;
        System.out.println("limit:" + tbuf.limit()) ;
        System.out.println("capacity:" + tbuf.capacity()) ;

        tbuf.mark();
        System.out.println("position:" + tbuf.position()) ;
        System.out.println("limit:" + tbuf.limit()) ;
        System.out.println("capacity:" + tbuf.capacity()) ;

        System.out.println( tbuf.get()) ;
        System.out.println("position:" + tbuf.position()) ;
        System.out.println("limit:" + tbuf.limit()) ;
        System.out.println("capacity:" + tbuf.capacity()) ;

        tbuf.reset();
        System.out.println("position:" + tbuf.position()) ;
        System.out.println("limit:" + tbuf.limit()) ;
        System.out.println("capacity:" + tbuf.capacity()) ;

        System.out.println( tbuf.get()) ;

        tbuf.clear();
        System.out.println("position:" + tbuf.position()) ;
        System.out.println("limit:" + tbuf.limit()) ;
        System.out.println("capacity:" + tbuf.capacity()) ;

输出:

position:3
limit:5
capacity:5
position:0
limit:3
capacity:5
47
position:1
limit:3
capacity:5
position:1
limit:3
capacity:5
63
position:2
limit:3
capacity:5
position:1
limit:3
capacity:5
63
position:0
limit:5
capacity:5

相关文章

网友评论

      本文标题:Java基础-Bytebuffer

      本文链接:https://www.haomeiwen.com/subject/fncmchtx.html