ByteBufferのflip()メソッドが「flip」と呼ばれるのはなぜですか?ここで「反転」とは何ですか?apidocによると、2回連続してフリップしても元の状態は復元されず、複数回のフリップはおそらくlimit()ゼロになる傾向があります。
どういうわけか「フリップを解除」してバイトを再利用できますか?
テールを連結して他のデータと反転させることはできますか?
ByteBufferのflip()メソッドが「flip」と呼ばれるのはなぜですか?ここで「反転」とは何ですか?apidocによると、2回連続してフリップしても元の状態は復元されず、複数回のフリップはおそらくlimit()ゼロになる傾向があります。
どういうわけか「フリップを解除」してバイトを再利用できますか?
テールを連結して他のデータと反転させることはできますか?
resetには、代わりにを使用します。
回答:
のかなり一般的な使用例の1つByteBufferは、データ構造を1つずつ作成してから、その構造全体をディスクに書き込むことです。flipフリップするために使用されるByteBuffer(「I / Oからの読み取り」からput「I / Oへの書き込み」(へティン)getの配列の後に:ティン)putSを充填するために使用され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()!