web-dev-qa-db-ja.com

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

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

どうにかしてバイトを再利用するために「フリップを解除」することはできますか?

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

81
Suzan Cioc

ByteBufferのかなり一般的な使用例の1つは、データ構造を1つずつ作成し、その構造全体をディスクに書き込むことです。 flipは、ByteBufferを「I/Oからの読み取り」(putting)から「I/Oへの書き込み」(getting)に切り替えるために使用されます。 putsのシーケンスを使用してByteBufferを埋めると、flipはバッファーの制限を現在の位置に設定し、位置をゼロにリセットします。これには、将来のバッファーからのgetまたはwriteputであったものをすべてバッファーに書き込むようになり、それ以上はしないという効果があります。

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);
}
111
nneonneo

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

3
Arnav Rao

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

したがって、それについて推論しようとせずに、APIを注意深く研究して使用してください。

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

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

0
irreputable

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

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

0
vkohli