包装的 ByteBuffers 应该返回什么状态?

What state should wrapped ByteBuffers be returned in?

我在探索 Java NIO 缓冲区的实际方面时遇到了麻烦。

NIO 提供了一系列类型化缓冲区,这些缓冲区在 ByteBuffer(即 CharBuffer、IntBuffer、DoubleBuffer 等)上呈现面向数据的视图。

当从后备缓冲区返回这些类型化缓冲区视图之一时,返回缓冲区的最佳状态是什么(或者对调用者来说最不令人惊讶的状态)?例如:

class Data<T> {
    ByteBuffer buffer;

    abstract T getData()
}

class CharData extends Data<CharBuffer> {

    CharBuffer getData() {
        CharBuffer charBuffer = buffer.asCharBuffer();
        // Should I adjust something here before returning?
        return charBuffer;
    }
}

是否应该设置为"write mode"? IE。保持原样,设置容量限制?

是否应该设置为"read mode"? IE。保留限制不变,将位置设置为 0?

是否应该显示为"full"? IE。设置容量限制,位置为 0?

如果我可以假设缓冲区总是满的,但又想方便随机访问内容,那么最好的方法是什么?

我敢肯定,对于经验丰富的 IO 程序员来说,这是一个微不足道的问题,但在遇到一些使用缓冲区的怪异陷阱后,我决定来这里问问人们的想法。

谢谢!

我总是return它准备好阅读(并且我总是在内部保持这种方式,除了代码中清晰可见的非常短的 flip/write/compact 或 flip/get/compact 序列:而且我总是在 finally 块中进行压缩)。

我认为没有理由将其显示为完整,但如果您在 returning 之前将数据放入其中,您可以考虑 returning 它已经翻转,例如 ByteBuffer.wrap() 确实如此。但我并不十分认同这种做法。如果这样做,请确保将其记录下来。