Java基础-Bytebuffer
2020-02-26 本文已影响0人
16325
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