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