ByteBuffer,什么是一种干净的方法来检测是否需要翻转

Jef*_*ffV 5 java bytebuffer

是否有一种干净确定的火灾方式来检测ByteBuffer是否需要翻转?

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

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

部分读取和写入也会增加此问题.我一直采用这样的惯例:缓冲区处于写入模式,并且创建副本并翻转以用于读取目的.当缓冲区传入我的代码时,会手动检查并设置位置和限制,因为它们处于写入模式.当然有更好的方法.

Ste*_*hen 6

将其封装在对象中 - 如下所示:

class FlippingByteBuffer {
  ByteBuffer buffer;
  boolean isInUse;
  boolean/Enum mode; //Is it read or write?
}
Run Code Online (Sandbox Code Playgroud)

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

//I'm about to read
FlippingByteBuffer fbb =...;
fbb.beginReading();
doSomething(fbb.getByteBuffer());
fbb.finishReading();
Run Code Online (Sandbox Code Playgroud)

这样你就知道什么时候发生了什么.您甚至可以开始使用Locks来确保读取和写入阻止彼此等.

如果中间有什么东西,(你正在打电话给某些东西而且它正在给你回电话),你可以将你FlippingByteBuffer放入地图和/或把它放在ThreadLocal(ewww!)或制作FlippingByteBuffer工具中ByteBuffer.这可能能够根据您正在做的事情在模式之间自动切换(使用读取和写入方法).

  • Java如何不在API中提供这种封装,这似乎是一个重要的特性......如果你碰巧在"if"块中使用flip(),你就永远无法确定你是处于读写模式. (3认同)