2009-11-26 112 views
4

是否有一个干净的确定的方法来检测ByteBuffer是否需要翻转?ByteBuffer,什么是干净的方式来检测是否需要翻转

我有一个ByteBuffer,用于打包和解包数据结构,也用于存储要打包/解包的字节。

但是,如果刚刚执行写操作或执行了读操作,或者如果ByteBuffer传递给我的代码,我无法保证缓冲区处于写模式或读模式,而无需手动操作位置和限制。

部分读取和写入也会增加此问题。我一直采用约定,即缓冲区处于写入模式,并且创建并复制副本以用于读取目的。当一个缓冲区被传递到我的代码是手动检查和位置和限制设置为他们将在写模式。当然有更好的方法。

回答

6

将其封装在一个对象 - 类似如下:

class FlippingByteBuffer { 
    ByteBuffer buffer; 
    boolean isInUse; 
    boolean/Enum mode; //Is it read or write? 
} 

然后你就可以在你的代码中使用它:

//I'm about to read 
FlippingByteBuffer fbb =...; 
fbb.beginReading(); 
doSomething(fbb.getByteBuffer()); 
fbb.finishReading(); 

你知道,当有事情发生这种方式。你甚至可以开始使用Lock s到确保读写块中的每个人等等

如果有什么东西在中间,(你调用的东西,它调用回给你),你可以把你的FlippingByteBuffer成地图和/或将其放入ThreadLocal(ewww!),或使FlippingByteBuffer执行ByteBuffer。那可能能够根据你在做什么在模式之间自动切换(使用读写方法)。

+3

Java如何不能在API中提供这种封装,这似乎是一个重要的功能......没有它,如果您碰巧在“if”块中使用flip(),则您无法确定是否处于读取或写入模式。 – mins 2014-07-04 17:40:40

2

就像一个想法,如何将ByteBuffer包装到另一个类中?只要您执行读取或写入操作,该类就可以更新和维护您想要的状态。您可能还想实现锁定或其他一些机制,以使其线程安全。

0

我认为它不是ByteBuffer的一部分的原因是因为“读取”和“写入”模式的概念是您对ByteBuffer概念的一部分。缓冲区可以随时读取或写入,因此在读/写状态中不会严格存在。

一旦我意识到这一点,我们有责任实现我们自己的读/写状态跟踪。

这是nio应该实现它的一个常见用例,尽管...特别是因为ByteBuffer接口不可扩展。

相关问题