2015-11-18 84 views
2

我无法处理Java NIO的缓冲区的实际问题。ByteBuffers应该包含哪些状态?

NIO提供一系列呈现面向数据视图在字节缓冲区(即CharBuffer的,IntBuffer,双缓冲等)输入缓冲器。

当返回的从背缓冲器这些类型的缓冲视图之一,什么是优选的状态(或将显示什么作为至少令人惊讶的状态到呼叫者),用于返回的缓冲区是在?例如:

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; 
    } 
} 

是否应该设置为“写入模式”?即离开位置,设置限制容量?

如果它被设置为“阅读模式”?即离开限制,将位置设置为0?

它应该呈现为“满”?即设置容量限制,位置为0?

什么是最好的方法,如果另外,我可以假设,缓冲区将永远是满的,但要便于内容的随机访问?我敢肯定,对于更多老练的IO程序员来说,这是一个微不足道的问题,但在碰到一些使用缓冲区的怪异陷阱后,我决定来这里问问人们的想法。

谢谢!

回答

1

我总是返回它读就绪(我始终保持他们的方式在内部,除了很短的翻盖/写/紧凑型或翻转在代码中清晰可见/得/紧凑序列:我总是做在最后的块中紧凑)。

我没有看到将其显示为完整的原因,但如果您在返回之前将数据放入其中,则可以考虑将其返回,如ByteBuffer.wrap()一样。但我并不完全同意这种做法。如果你这样做,一定要记录它。

+0

有意详细说明最后一点?我看到将它们全部返回的原因是ByteBuffer.allocate()和ByteBuffer.wrap()的行为与此类似,所以它与通常获取缓冲区的方式有点一致......这确实倾向于暗示缓冲区是“空的”,但我打算在每次访问时读写完整的缓冲区,所以对我来说似乎是合理的......这是否意味着我可能更适合使用除ByteBuffers之外的其他功能? – gorgonzola

+0

'allocate()'将缓冲区返回为空。 'wrap()'返回它翻转。既不返回它已满,也不应该,除非*已满。你不能读入一个完整的缓冲区,并且你不需要一个完整的缓冲区就可以从中写入。 – EJP

相关问题