[英]What is the purpose of ByteBuffer's flip method? (And why is it called "flip"?)
為什么 ByteBuffer 的 flip() 方法稱為“flip”? 這里的“翻轉”是什么? 根據 apidoc,連續兩次翻轉不會恢復原始狀態,多次翻轉可能會使limit()
變為零。
我可以以某種方式“取消翻轉”以重用超出限制的字節嗎?
我可以連接尾部以與其他一些數據翻轉嗎?
ByteBuffer
一個相當常見的用例是逐個構建一些數據結構,然后將整個結構寫入磁盤。 flip
用於將ByteBuffer
從“讀取 I/O”( put
ting)翻轉到“寫入 I/O”( get
ting):使用put
序列填充ByteBuffer
, flip
將設置限制的緩沖區到當前位置並將位置重置為零。 這具有使未來從緩沖區get
或write
寫入所有put
緩沖區的內容的效果,而不是更多。
完成put
,您可能希望重用ByteBuffer
來構造另一個數據結構。 要“解開”它,請調用clear
。 這會將限制重置為容量(使所有緩沖區可用),並將位置重置為 0。
所以,一個典型的使用場景:
ByteBuffer b = new ByteBuffer(1024);
for(int i=0; i<N; i++) {
b.clear();
b.put(header[i]);
b.put(data[i]);
b.flip();
out.write(b);
}
Flip 將當前位置值分配給 limit 屬性並將 position 屬性設置為 0。Flip 可用於僅從緩沖區中排出活動元素。
例如,下面的程序打印“hello”而不是緩沖區的空元素。 方法調用 limit 和 position 可以替換為 flip 。
CharBuffer cbuff = CharBuffer.allocate(40);
cbuff.put("hello");
// what below two line of code is what flip does
cbuff.limit(cbuff.position());
cbuff.position(0);
while(cbuff.hasRemaining()) {
System.out.println(cbuff.get());
}
有關緩沖區和通道的更多信息,請參見http://www.zoftino.com/java-nio-tutorial 。
ByteBuffer 設計不當。 有很多來自體面的程序員的抱怨。
所以不要試圖去推理它,只要仔細研究和使用 API。
現在我不能不提出替代方案就說壞話,所以這里是:
緩沖區具有固定capacity
; 它維護 2 個指針: start
和end
。 get()
返回start
位置的字節並遞增start
。 put()
將字節放在end
位置並遞增end
。 沒有flip()
!
flip()方法使緩沖區為新的通道寫入或相對獲取操作序列做好准備:它將限制設置為當前位置,然后將位置設置為零。
緩沖區跟蹤寫入其中的數據。 寫入后,調用flip()方法從寫入模式切換到讀取模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.