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
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
相关文章推荐
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- byteBuffer, clear(), flip(), rewind(), allocate(), allocateDirect()
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- ByteBuffer的flip clear及rewind区别
- Buffer(ByteBuffer)以及flip,clear及rewind区别
- (1.28)java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer 以及flip,clear及rewind区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- ByteBuffer的flip,rewind,clear问题
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java的NIO包中ByteBuffer类的clear(),flip(),rewind()方法的意思
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java的NIO包中ByteBuffer类的clear(),flip(),rewind()方法的意思
- java.nio.ByteBuffer 以及flip,clear及rewind区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
- java.nio.ByteBuffer中flip、rewind、clear方法的区别