是否有一种干净可靠的火灾方式来检测ByteBuffer是否需要翻转?
我有一个ByteBuffer,用于打包和解包数据结构,也用于存储要打包/解包的字节。
但是,如果刚刚执行了写操作或执行了读操作,或者如果将ByteBuffer传递给我的代码,我无法保证缓冲区处于写模式或读模式而不需要手动操作位置和限制。
部分读取和写入也会增加此问题。我一直采用这样的惯例:缓冲区处于写入模式,并且创建副本并翻转以用于读取目的。当缓冲区传入我的代码时,会手动检查并设置位置和限制,因为它们处于写入模式。当然有更好的方法。
答案 0 :(得分: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
来确保阅读和写作相互阻止等等。
如果中间有什么东西,(你正在打电话给某人,并且正在回复你),你可以将FlippingByteBuffer
放入地图和/或将其放入ThreadLocal
(ewww !),或者FlippingByteBuffer
实施ByteBuffer
。 可能能够在模式之间自动切换(使用读取和写入方法),具体取决于您正在做什么。
答案 1 :(得分:2)
就像一个想法,如何将ByteBuffer包装在另一个类中?无论何时执行读取或写入操作,该类都可以更新和维护所需的状态。您可能还希望实现锁定或其他一些机制以使其成为线程安全的。
答案 2 :(得分:0)
我认为它不属于ByteBuffer的原因是因为" read"和"写"模式是你的ByteBuffer概念的一部分。缓冲区可以随时读取或写入,因此在读/写状态下不会严格存在。
一旦我意识到这一点,我们就有责任实施我们自己的读/写状态跟踪。
这是一个常见的用例,nio应该实现它...尤其是因为ByteBuffer接口不可扩展。