6

ByteBufferを反転する必要があるかどうかを検出するためのクリーンで確実な方法はありますか?

データ構造のパックとアンパック、およびパック/アンパックされるバイトのストレージに使用されるByteBufferがあります。

ただし、書き込み操作が実行されたばかりか、読み取り操作が実行された場合、またはByteBufferがコードに渡された場合、手動で位置と制限を操作せずに、バッファーが書き込みモードまたは読み取りモードであることを保証できません。

部分的な読み取りと書き込みも存在し、この問題に追加されます。私は、バッファが書き込みモードのままで、複製が作成され、読み取り目的で反転されるという規則を採用しています。バッファが私のコードに渡されると、手動で検査され、書き込みモードの場合と同じように位置と制限が設定されます。確かにもっと良い方法があります。

4

3 に答える 3

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();

このようにして、何かが起こっていることを知ることができます。Locks を使用して、読み取りと書き込みが互いにブロックされるようにすることもできます。

途中に何かがある場合 (あなたが何かを呼び出していて、それがあなたに戻ってきている場合)、FlippingByteBufferマップに配置したり、ThreadLocal(ewww!) に配置したり、FlippingByteBufferimplementを作成したりできますByteBuffer。何をしているかに応じて、モードを自動的に切り替えることができる場合があります (読み取りメソッドと書き込みメソッドを使用)

于 2009-11-26T02:10:56.923 に答える
2

一つの案として、別のクラスで ByteBuffer をラップするのはどうですか? そのクラスは、読み取りまたは書き込み操作を実行するたびに、必要な状態を更新および維持できます。スレッドセーフにするために、ロックやその他のメカニズムを実装することもできます。

于 2009-11-26T02:11:16.627 に答える