106

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

制限を超えたバイトを再利用するために、どういうわけか「反転」できますか?

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

4

4 に答える 4

141

のかなり一般的な使用例の 1 つByteBufferは、いくつかのデータ構造を 1 つずつ作成してから、その構造全体をディスクに書き込むことです。flipByteBuffer、「I/O からの読み取り」( putting) から「I/O への書き込み」( getting)に切り替えるためにput使用されます。位置をゼロにリセットします。これは、フューチャまたはバッファから、バッファにあったものをすべて書き込み、それ以上は書き込まないようにする効果があります。ByteBufferflipgetwriteput

を終了した後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);
}
于 2013-02-09T23:56:54.780 に答える
12

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

于 2018-05-23T05:30:14.483 に答える
2

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

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

于 2018-08-29T14:22:59.963 に答える
2

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

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

今では、代替手段を提示せずに悪口を言うことはできません。

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

于 2013-02-10T01:36:26.730 に答える