【问题标题】:ByteBuffer, what is a clean way to detect if it needs to be flippedByteBuffer,什么是检测是否需要翻转的干净方法
【发布时间】:2009-11-26 01:43:53
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java 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 接口不可扩展。

      【讨论】:

        猜你喜欢
        • 2013-01-25
        • 1970-01-01
        • 2018-05-03
        • 1970-01-01
        • 1970-01-01
        • 2014-10-26
        • 2011-09-07
        • 2012-10-06
        相关资源
        最近更新 更多