Java 用缓冲垫包裹的物品应该返回到什么状态?

Java 用缓冲垫包裹的物品应该返回到什么状态?,java,io,nio,bytebuffer,Java,Io,Nio,Bytebuffer,我在摸索JavaNIO缓冲区的实际方面遇到了困难 NIO提供了一系列类型化的缓冲区,这些缓冲区在ByteBuffer(即CharBuffer、IntBuffer、DoubleBuffer等)上呈现面向数据的视图 当从备份缓冲区返回其中一个类型化缓冲区视图时,返回的缓冲区的首选状态是什么(或者对调用者来说最不意外的状态是什么)?例如: class Data<T> { ByteBuffer buffer; abstract T getData() } class Ch

我在摸索JavaNIO缓冲区的实际方面遇到了困难

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;
    }
}
类数据{
ByteBuffer缓冲器;
抽象T getData()
}
类CharData扩展数据{
CharBuffer getData(){
CharBuffer CharBuffer=buffer.asCharBuffer();
//我应该在回来之前调整一下这里吗?
返回缓冲区;
}
}
是否应将其设置为“写入模式”?即,保持位置不变,设置容量限制

是否应将其设置为“读取模式”?即保持限制不变,将位置设置为0

是否应以“完整”表示?即,将限制设置为容量,将位置设置为0

如果另外,我可以假设缓冲区总是满的,但希望促进对内容的随机访问,那么最好的方法是什么

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


谢谢

我总是将其返回以备阅读(我总是在内部保持这种方式,除了在代码中清晰可见的非常短的翻转/写入/压缩或翻转/获取/压缩序列:我总是在finally块中进行压缩)


<>我看不出有充分的理由把它呈现出来,但是如果你在返回之前把数据放进去,你可以考虑把它重新翻转,比如<代码> ByteBuffer .Wrp()。但我并不真的同意这种做法。如果这样做,请确保将其记录在案。

是否要详细说明最后一点?我之所以将它们返回为full,是因为ByteBuffer.allocate()和ByteBuffer.wrap()的行为都是这样的,所以这与通常获取缓冲区的方式是一致的。。。这确实意味着缓冲区是“空的”,但我打算在每次访问时读写满的缓冲区,所以对我来说这似乎是合理的。。。这是否意味着我最好使用ByteBuffers以外的东西?
allocate()
将缓冲区返回为空
wrap()
将其作为翻转返回。两者都不应返回为已满,也不应返回,除非已满。您无法读取完整的缓冲区,也不需要完整的缓冲区才能从中写入。