ByteBufferのflip()メソッドが「flip」と呼ばれるのはなぜですか?ここで「反転」とは何ですか?apidocによると、2回連続してフリップしても元の状態は復元されず、複数回のフリップはおそらくlimit()
ゼロになる傾向があります。
どういうわけか「フリップを解除」してバイトを再利用できますか?
テールを連結して他のデータと反転させることはできますか?
ByteBufferのflip()メソッドが「flip」と呼ばれるのはなぜですか?ここで「反転」とは何ですか?apidocによると、2回連続してフリップしても元の状態は復元されず、複数回のフリップはおそらくlimit()
ゼロになる傾向があります。
どういうわけか「フリップを解除」してバイトを再利用できますか?
テールを連結して他のデータと反転させることはできますか?
reset
には、代わりにを使用します。
回答:
のかなり一般的な使用例の1つByteBuffer
は、データ構造を1つずつ作成してから、その構造全体をディスクに書き込むことです。flip
フリップするために使用されるByteBuffer
(「I / Oからの読み取り」からput
「I / Oへの書き込み」(へティン)get
の配列の後に:ティン)put
Sを充填するために使用されByteBuffer
、flip
現在の位置までのバッファの制限を設定します位置をゼロにリセットします。これには、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
何ですか?
write(ByteBuffer)
メソッドを持っている他のもの。(そのタイプが何であるかは実際には関係ありません...)
Buffer.clear
容量の制限と位置を0にBuffer.reset
リセットする必要がありmark
ます。位置のみをにリセットします。
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
ます; それは2つのポインタを維持します:start
とend
。get()
そのstart
位置のバイトを返し、インクリメントしますstart
。put()
バイトをそのend
位置に置き、インクリメントしますend
。いいえflip()
!