您的位置:首页 > Web前端

ByteBuffer的position、flip和clear

2012-05-09 10:03 330 查看
position测试:

Java代码


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());

输出结果:

Java代码


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

结论:

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

--------------------------------------------------------------------------------------------------------------------------------------------------------------

flip测试:

Java代码


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());

输出结果:

Java代码


起始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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: