第二章 缓冲区(4)

2.1.6 移出数据

 

如果我们将图2.5中的buffer对象传入到通道channel中,它将从positionlimit的数据传送到通道中去。这显得华而不实是吗?不!

 

同样的,当你接收到一个buffer对象,在你提取数据之前你可能需要先调用flip操作。例如,当channel完成read操作之后,如果你想查看放入由channel放入Buffer中的数据,那你需要在get之前调用flip操作。Channel对象调用put方法向缓冲区填充数据,putread方法可以混合操作。

 

hasRemaining方法可以在你移出数据时告诉你Buffer中是否还有数据。下面是一种将数据从Buffer中复制到数组的方法(2.1.10小节中,我们将学到更高效的移动大批量数据的方法)

 

       for(int i=0;buffer.hasRemaining();i++){

                     myByteArray[i]=buffer.get();

              }

 

另外,remaining方法将告诉你从PositionLimit中剩余的元素个数。你也可以通过下面的循环来移动数据。

 

       int count=buffer.remaining();

              for(int i=0;i<count;++i){

                     myByteArray[i]=buffer.get();

              }

 

如果你需要对Buffer进行互斥访问,这种方法会更高效,因为它不需要每次循环调用都对Limit属性进行检查。第一个例子可以让多个线程对Buffer进行同步操作。

 

注意:

     Buffer类不是线程安全的。如果你想让多个线程同时访问Buffer对象,在访问Buffer对象之前你需要获取Buffer对象锁来进行同步。

 

如果Buffer对象完成了填充或移出,它就可以被重用了。Clear方法可以让Buffer对象重置。这个方法不改变Buffer对象中的数据,但是它将Limit设置为capacityPosition设置为0,就跟图2.2一样。这样Buffer对象就可以被重新使用,参看2.1的例子。

                            例子2.1 Buffer对象填充和移出数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值