2009-11-26 102 views
4

是否有一個乾淨的確定的方法來檢測ByteBuffer是否需要翻轉?ByteBuffer,什麼是乾淨的方式來檢測是否需要翻轉

我有一個ByteBuffer,用於打包和解包數據結構,也用於存儲要打包/解包的字節。

但是,如果剛剛執行寫操作或執行了讀操作,或者如果ByteBuffer傳遞給我的代碼,我無法保證緩衝區處於寫模式或讀模式,而無需手動操作位置和限制。

部分讀取和寫入也會增加此問題。我一直採用約定,即緩衝區處於寫入模式,並且創建並複製副本以用於讀取目的。當一個緩衝區被傳遞到我的代碼是手動檢查和位置和限制設置爲他們將在寫模式。當然有更好的方法。

回答

6

將其封裝在一個對象 - 類似如下:

class FlippingByteBuffer { 
    ByteBuffer buffer; 
    boolean isInUse; 
    boolean/Enum mode; //Is it read or write? 
} 

然後你就可以在你的代碼中使用它:

//I'm about to read 
FlippingByteBuffer fbb =...; 
fbb.beginReading(); 
doSomething(fbb.getByteBuffer()); 
fbb.finishReading(); 

你知道,當有事情發生這種方式。你甚至可以開始使用Lock s到確保讀寫塊中的每個人等等

如果有什麼東西在中間,(你調用的東西,它調用回給你),你可以把你的FlippingByteBuffer成地圖和/或將其放入ThreadLocal(ewww!),或使FlippingByteBuffer執行ByteBuffer。那可能能夠根據你在做什麼在模式之間自動切換(使用讀寫方法)。

+3

Java如何不能在API中提供這種封裝,這似乎是一個重要的功能......沒有它,如果您碰巧在「if」塊中使用flip(),則您無法確定是否處於讀取或寫入模式。 – mins 2014-07-04 17:40:40

2

就像一個想法,如何將ByteBuffer包裝到另一個類中?只要您執行讀取或寫入操作,該類就可以更新和維護您想要的狀態。您可能還想實現鎖定或其他一些機制,以使其線程安全。

0

我認爲它不是ByteBuffer的一部分的原因是因爲「讀取」和「寫入」模式的概念是您對ByteBuffer概念的一部分。緩衝區可以隨時讀取或寫入,因此在讀/寫狀態中不會嚴格存在。

一旦我意識到這一點,我們有責任實現我們自己的讀/寫狀態跟蹤。

這是nio應該實現它的一個常見用例,儘管...特別是因爲ByteBuffer接口不可擴展。

相關問題