ByteBufferのflipメソッドの目的は何ですか?(そして、なぜそれは「フリップ」と呼ばれるのですか?)


95

ByteBufferのflip()メソッドが「flip」と呼ばれるのはなぜですか?ここで「反転」とは何ですか?apidocによると、2回連続してフリップしても元の状態は復元されず、複数回のフリップはおそらくlimit()ゼロになる傾向があります。

どういうわけか「フリップを解除」してバイトを再利用できますか?

テールを連結して他のデータと反転させることはできますか?


5
バッファを読み取りから書き込みに「反転」します(またはその逆)。したがって、hw.blogspot.com / 2009/10 /…
ブライアンローチ

2
@BrianRoach:読み取りから書き込みに切り替わりますが、固定サイズの構造体を記述していない限り、書き込みから読み取りにはあまり役立ちません。反転して書き込みから読み取りにするresetには、代わりにを使用します。
nneonneo 2013

「客観的な」質問をすることを忘れないでください。または、少なくとも、主要な質問を客観的に見せます:D

@ nneonneo-それはちょっと質問ではなく、詳細を説明するのにそれほど多くの時間を費やすつもりはなかったので、コメントとリンクだけでした。
ブライアンローチ

回答:


130

のかなり一般的な使用例の1つByteBufferは、データ構造を1つずつ作成してから、その構造全体をディスクに書き込むことです。flipフリップするために使用されるByteBuffer(「I / Oからの読み取り」からput「I / Oへの書き込み」(へティン)getの配列の後に:ティン)putSを充填するために使用されByteBufferflip現在の位置までのバッファの制限を設定します位置をゼロにリセットします。これには、futureを作成する効果があります。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);
}

タイプはout何ですか?
Suzan Cioc 2013

6
またはwrite(ByteBuffer)メソッドを持っている他のもの。(そのタイプが何であるかは実際には関係ありません...)
Stephen C

1
Buffer.clear容量の制限と位置を0にBuffer.resetリセットする必要がありmarkます。位置のみをにリセットします。
Kelvin Ng

1
@KelvinNg:その通りです。これを反映するように回答を修正しました。素敵なキャッチをありがとう!
nneonneo 2013年

1
@ user963241:I / Oからバッファへの読み取りバッファからI / Oへの書き込み。
nneonneo 2017年

7

Flipは、現在の位置の値をlimitプロパティに割り当て、positionプロパティを0に設定します。Flipは、バッファからアクティブな要素のみを排出する場合に役立ちます。

たとえば、以下のプログラムは、バッファの空の要素ではなく「hello」を出力します。メソッド呼び出しの制限と位置は、フリップに置き換えることができます。

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を参照してください


非常に広範な報道へのリンクをありがとう!ソースが含まれているととても素晴らしいです。Java APIのドキュメントでは、「フリップ」という単語が一般的なコンピュータサイエンスの用語であるかのように説明なしで使用されているように見えましたが、明らかに少数の人々(私を含む)はそれが当てはまらないことに気づいていません。
ジョンマイヤー

3

ByteBufferの設計が不適切です。まともなプログラマーからの苦情がたくさんあります。

したがって、それについて推論しようとせず、APIを注意深く調べて使用するだけです。

今、私は代替案を提示せずにそれを悪口にすることはできないので、ここにあります:

バッファには固定がありcapacityます; それは2つのポインタを維持します:startendget()そのstart位置のバイトを返し、インクリメントしますstartput()バイトをそのend位置に置き、インクリメントしますend。いいえflip()


6
それで、不満は何ですか?個人的な不満があれば大丈夫ですが、「X APIはダメだ、人々はそう言った」とだけ言っているわけではありません。
nneonneo 2013

13
そのリンクを投稿することは、文字通りあなたが最初にしなければならなかったすべてです。私はあなたが嘘をついていると非難したことはありません。苦情の出所と性質について詳しく説明するように頼んだだけです。
nneonneo 2013

2
これは、人々が適切な量の努力を払って自発的に支援を提供する場所にすぎません。それぞれの答えをよく研究された学術論文に拡張する必要はありません。
評判の悪い2013

8
そして、これはまた、信頼できると思われない限り、人々が誰かの言葉を受け取らない場所でもあります。
arunmoezhi 2013年

8
ソースを提供する必要さえありません。ByteBufferの設計が不適切であることは明らかです。フリップは目的を果たしません。フリップを忘れるとバグの原因となるだけです。制御できない衝動を感じた場合は、少なくとも、フリップされたByteBufferとフリップされていないByteBufferを異なるクラスにして、型システムがバグをキャッチできるようにします。
Gurgeh 2013年

0

flip()メソッドは、チャネル書き込みまたは相対取得操作の新しいシーケンスに対応できるようにバッファーを作成します。現在の位置に制限を設定してから、位置をゼロに設定します。

バッファは、それに書き込まれたデータを追跡します。書き込み後、flip()メソッドが呼び出され、書き込みモードから読み取りモードに切り替わります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.