position测试:
输出结果:
结论:
--------------------------------------------------------------------------------------------------------------------------------------------------------------
flip测试:
输出结果:
结论:
如果buffer的capacity是10,put(10, value)将出现java.lang.IndexOutOfBoundsException异常,因为position重0开始,容量为10,那么有效索引为0-9
- 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