有没有一种明确的可靠方法来检测ByteBuffer是否需要翻转?

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

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

还存在部分读写,这增加了这个问题。我一直在采用这样的约定:将缓冲区保留为写模式,并创建一个副本并将其翻转以用于读取目的。当缓冲区传入我的代码时,将对其进行手动检查,并设置位置和限制,就像在写模式下一样。当然有更好的方法。

最佳答案

将其封装在一个对象中-类似于以下内容:

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来确保读取和写入相互阻塞,等等。

如果中间有东西(您正在调用某事,并且正在回呼给您),则可以将FlippingByteBuffer放入 map 和/或放入ThreadLocal(ewww!),或使FlippingByteBuffer实现ByteBuffer。根据您正在执行的操作,这也许能够自动在模式之间切换(使用读写方法)。

10-07 16:19