簡體   English   中英

ByteBuffer的flip方法的目的是什么? (為什么它被稱為“翻轉”?)

[英]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序列填充ByteBufferflip將設置限制的緩沖區到當前位置並將位置重置為零。 這具有使未來從緩沖區getwrite寫入所有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 個指針: startend get()返回start位置的字節並遞增start put()將字節放在end位置並遞增end 沒有flip()

flip()方法使緩沖區為新的通道寫入或相對獲取操作序列做好准備:它將限制設置為當前位置,然后將位置設置為零。

緩沖區跟蹤寫入其中的數據。 寫入后,調用flip()方法從寫入模式切換到讀取模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM