ByteBuffer,啥是检测是不是需要翻转的干净方法
Posted
技术标签:
【中文标题】ByteBuffer,啥是检测是不是需要翻转的干净方法【英文标题】:ByteBuffer, what is a clean way to detect if it needs to be flippedByteBuffer,什么是检测是否需要翻转的干净方法 【发布时间】:2009-11-26 01:43:53 【问题描述】:是否有一种绝对可靠的方法来检测 ByteBuffer 是否需要翻转?
我有一个 ByteBuffer 用于打包和解包数据结构,也用于存储要打包/解包的字节。
但是,如果刚刚执行了写入操作或执行了读取操作,或者如果将 ByteBuffer 传递给我的代码,我无法保证缓冲区处于写入模式或读取模式,而无需手动操作位置和限制。
部分读取和写入也增加了这个问题。我一直在采用这样的约定,即缓冲区处于写入模式,并创建一个副本并翻转以用于读取目的。当将缓冲区传递给我的代码时,会手动检查并设置位置和限制,就像它们处于写入模式一样。肯定有更好的方法。
【问题讨论】:
【参考方案1】:将其封装在一个对象中 - 如下所示:
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
。 可能能够根据您的操作自动在模式之间切换(使用读取和写入方法)。
【讨论】:
Java 怎么不能在 API 中提供这种封装,这似乎是一个重要的特性……没有它,如果你碰巧使用了 Flip(),你永远无法确定你是处于读取模式还是写入模式在“if”块内。【参考方案2】:作为一个想法,将 ByteBuffer 包装在另一个类中怎么样?每当您执行读取或写入操作时,该类都可以更新和维护您想要的状态。您可能还想实现锁定或其他一些机制以使其成为线程安全的。
【讨论】:
【参考方案3】:我认为它不属于 ByteBuffer 的原因是因为“读取”和“写入”模式的概念是您的 ByteBuffer 概念的一部分。缓冲区可以随时读取或写入,因此并不严格存在于读/写状态。
一旦我意识到这一点,我们就应该负责实现自己的读/写状态跟踪。
这是一个非常常见的用例,但 nio 应该实现它......尤其是因为 ByteBuffer 接口不可扩展。
【讨论】:
以上是关于ByteBuffer,啥是检测是不是需要翻转的干净方法的主要内容,如果未能解决你的问题,请参考以下文章
ByteBuffer.getInt() 是不是阻塞? [关闭]
需要帮助使用 Flex/ActionScript 3 创建平滑的翻转或 FishEye 效果
将异常的堆栈跟踪转换为 byte[] 数组或 ByteBuffer (Java) 是不是更有效?