ByteBufferのflip()メソッドが「flip」と呼ばれるのはなぜですか?ここで「反転」とは何ですか? apidocによると、2回連続してフリップしても元の状態は復元されず、複数回フリップするとおそらくlimit()
がゼロになる傾向があります。
どうにかしてバイトを再利用するために「フリップを解除」することはできますか?
テールを連結して他のデータと反転させることはできますか?
ByteBuffer
のかなり一般的な使用例の1つは、データ構造を1つずつ作成し、その構造全体をディスクに書き込むことです。 flip
は、ByteBuffer
を「I/Oからの読み取り」(put
ting)から「I/Oへの書き込み」(get
ting)に切り替えるために使用されます。 put
sのシーケンスを使用してByteBuffer
を埋めると、flip
はバッファーの制限を現在の位置に設定し、位置をゼロにリセットします。これには、将来のバッファーからの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);
}
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 を参照してください。
ByteBufferの設計が不適切です。まともなプログラマーから多くの苦情があります。
したがって、それについて推論しようとせずに、APIを注意深く研究して使用してください。
今、私は代替案を提示せずにそれを悪口にすることはできませんので、ここにあります:
バッファーには固定のcapacity
があります。 start
とend
の2つのポインターを保持します。 get()
は、start
位置のバイトを返し、start
をインクリメントします。 put()
は、バイトをend
位置に置き、end
をインクリメントします。いいえflip()
!
flip()メソッドは、バッファをチャネル書き込みまたは相対取得操作の新しいシーケンスの準備を整えます。現在の位置に制限を設定してから、位置をゼロに設定します。
バッファは、そこに書き込まれたデータを追跡します。書き込み後、flip()メソッドが呼び出され、書き込みモードから読み取りモードに切り替わります。