2.1.6 移出数据
如果我们将图2.5中的buffer对象传入到通道channel中,它将从position到limit的数据传送到通道中去。这显得华而不实是吗?不!
同样的,当你接收到一个buffer对象,在你提取数据之前你可能需要先调用flip操作。例如,当channel完成read操作之后,如果你想查看放入由channel放入Buffer中的数据,那你需要在get之前调用flip操作。Channel对象调用put方法向缓冲区填充数据,put和read方法可以混合操作。
hasRemaining方法可以在你移出数据时告诉你Buffer中是否还有数据。下面是一种将数据从Buffer中复制到数组的方法(在2.1.10小节中,我们将学到更高效的移动大批量数据的方法)。
for(int i=0;buffer.hasRemaining();i++){
myByteArray[i]=buffer.get();
}
另外,remaining方法将告诉你从Position到Limit中剩余的元素个数。你也可以通过下面的循环来移动数据。
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设置为capacity,Position设置为0,就跟图2.2一样。这样Buffer对象就可以被重新使用,参看2.1的例子。
例子2.1 向Buffer对象填充和移出数据