6

是否有一种绝对可靠的方法来检测 ByteBuffer 是否需要翻转?

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

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

部分读取和写入也增加了这个问题。我一直在采用这样的约定,即缓冲区处于写入模式,并创建一个副本并翻转以用于读取目的。当将缓冲区传递给我的代码时,会手动检查并设置位置和限制,就像它们处于写入模式一样。肯定有更好的方法。

4

3 回答 3

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();

这样你就知道什么时候发生了。你甚至可以开始使用Locks 来确保读写相互阻塞等。

如果中间有什么东西,(你正在调用某物并且它正在回叫你),你可以将你的FlippingByteBuffer东西放入地图和/或将其放入ThreadLocal(ewww!),或 make FlippingByteBufferimplement ByteBuffer。这可能能够根据您的操作自动在模式之间切换(使用读取和写入方法)。

于 2009-11-26T02:10:56.923 回答
2

就像一个想法,将 ByteBuffer 包装在另一个类中怎么样?每当您执行读取或写入操作时,该类都可以更新和维护您想要的状态。您可能还希望实现锁定或其他一些机制以使其成为线程安全的。

于 2009-11-26T02:11:16.627 回答
-1

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

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

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

于 2016-03-04T21:10:00.023 回答