2015-11-18 120 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

相關問題