ByteBuffer使用详解

position测试: 
Java代码   收藏代码
  1. ByteBuffer bb = ByteBuffer.allocate(10);  
  2. System.out.println("起始position: "+bb.position());  
  3. bb.put(5, (byte)15);  
  4. System.out.println("指定位置put数据之后的position: "+bb.position());  
  5. bb.put((byte)20);  
  6. System.out.println("直接put数据之后的position: "+bb.position());  
  7. bb.put((byte)20);  
  8. System.out.println("再次直接put数据之后的position: "+bb.position());  
  9. bb.clear();  
  10. System.out.println("调用clear之后的position: "+bb.position());  

输出结果: 
Java代码   收藏代码
  1. 起始position: 0  
  2. 指定位置put数据之后的position: 0  
  3. 直接put数据之后的position: 1  
  4. 再次直接put数据之后的position: 2  
  5. 调用clear之后的position: 0  

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

-------------------------------------------------------------------------------------------------------------------------------------------------------------- 
flip测试: 
Java代码   收藏代码
  1. ByteBuffer bb = ByteBuffer.allocate(10);  
  2. System.out.println("起始position: "+bb.position());  
  3. System.out.println("起始limit: "+bb.limit());  
  4. System.out.println("起始capacity: "+bb.capacity());  
  5. bb.put((byte)20);  
  6. bb.put((byte)20);  
  7. bb.put((byte)20);  
  8. bb.put((byte)20);  
  9. bb.put((byte)20);  
  10. System.out.println("put五个数据之后的position: "+bb.position());  
  11. System.out.println("put五个数据之后的limit: "+bb.limit());  
  12. System.out.println("put五个数据之后的capacity: "+bb.capacity());  
  13. bb.flip();  
  14. System.out.println("调用flip之后的position: "+bb.position());  
  15. System.out.println("调用flip之后的limit: "+bb.limit());  
  16. System.out.println("调用flip之后的capacity: "+bb.capacity());  
  17. bb.clear();  
  18. System.out.println("调用clear之后的position: "+bb.position());  
  19. System.out.println("调用clear之后的limit: "+bb.limit());  
  20. System.out.println("调用clear之后的capacity: "+bb.capacity());  
输出结果: 
Java代码   收藏代码
  1. 起始position: 0  
  2. 起始limit: 10  
  3. 起始capacity: 10  
  4. put五个数据之后的position: 5  
  5. put五个数据之后的limit: 10  
  6. put五个数据之后的capacity: 10  
  7. 调用flip之后的position: 0  
  8. 调用flip之后的limit: 5  
  9. 调用flip之后的capacity: 10  
  10. 调用clear之后的position: 0  
  11. 调用clear之后的limit: 10  
  12. 调用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值