ByteBuffer的position、flip和clear

position测试:
ByteBuffer bb = ByteBuffer.allocate(10);
System.out.println("起始position: "+bb.position());
bb.put(5, (byte)15);
System.out.println("指定位置put数据之后的position: "+bb.position());
bb.put((byte)20);
System.out.println("直接put数据之后的position: "+bb.position());
bb.put((byte)20);
System.out.println("再次直接put数据之后的position: "+bb.position());
bb.clear();
System.out.println("调用clear之后的position: "+bb.position());

输出结果:
起始position: 0
指定位置put数据之后的position: 0
直接put数据之后的position: 1
再次直接put数据之后的position: 2
调用clear之后的position: 0

结论:
  • byte buffer的position起始值是0
  • 指定位置的put不会导致position偏移
  • clear重置position为0

--------------------------------------------------------------------------------------------------------------------------------------------------------------
flip测试:
ByteBuffer bb = ByteBuffer.allocate(10);
System.out.println("起始position: "+bb.position());
System.out.println("起始limit: "+bb.limit());
System.out.println("起始capacity: "+bb.capacity());
bb.put((byte)20);
bb.put((byte)20);
bb.put((byte)20);
bb.put((byte)20);
bb.put((byte)20);
System.out.println("put五个数据之后的position: "+bb.position());
System.out.println("put五个数据之后的limit: "+bb.limit());
System.out.println("put五个数据之后的capacity: "+bb.capacity());
bb.flip();
System.out.println("调用flip之后的position: "+bb.position());
System.out.println("调用flip之后的limit: "+bb.limit());
System.out.println("调用flip之后的capacity: "+bb.capacity());
bb.clear();
System.out.println("调用clear之后的position: "+bb.position());
System.out.println("调用clear之后的limit: "+bb.limit());
System.out.println("调用clear之后的capacity: "+bb.capacity());
输出结果:
起始position: 0
起始limit: 10
起始capacity: 10
put五个数据之后的position: 5
put五个数据之后的limit: 10
put五个数据之后的capacity: 10
调用flip之后的position: 0
调用flip之后的limit: 5
调用flip之后的capacity: 10
调用clear之后的position: 0
调用clear之后的limit: 10
调用clear之后的capacity: 10

结论:
  • 调用flip之后产生的效果是先将当前position的值设置为limit,然后将position重置为0
  • flip不会影响buffer的容量
  • clear导致buffer所有状态重置


如果buffer的capacity是10,put(10, value)将出现java.lang.IndexOutOfBoundsException异常,因为position重0开始,容量为10,那么有效索引为0-9

你可能感兴趣的:(java,clear,ByteBuffer,position,flip)