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

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

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

【讨论】:

Java 怎么不能在 API 中提供这种封装,这似乎是一个重要的特性……没有它,如果你碰巧使用了 Flip(),你永远无法确定你是处于读取模式还是写入模式在“if”块内。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于ByteBuffer,啥是检测是不是需要翻转的干净方法的主要内容,如果未能解决你的问题,请参考以下文章

ByteBuffer.getInt() 是不是阻塞? [关闭]

ffmpeg 自动检测人像然后做必要的翻转

需要帮助使用 Flex/ActionScript 3 创建平滑的翻转或 FishEye 效果

将异常的堆栈跟踪转换为 byte[] 数组或 ByteBuffer (Java) 是不是更有效?

Azure/Microsoft 认知服务自定义视觉 - 啥是对象检测模型输出张量规范?

玩转 ByteBuffer