28

私は、flip() が現在のバッファ位置を 0 に設定し、制限を前のバッファ位置に設定するのに対し、rewind() は現在のバッファ位置を 0 に設定することを認識しています。

次のコードでは、rewind() または flip() を使用しても同じ結果が得られます。

byte b = 127;
bb.put(b);
bb.rewind();//or flip();

System.out.println(bb.get());
bb.rewind();// or flip();
System.out.println(bb.get());

これら2つの方法の違いが本当に重要な実際の例を教えてください。前もって感謝します。

4

6 に答える 6

4

rewind( ) メソッドは、flip( ) に似ていますが、制限には影響しません。位置を 0 に戻すだけです。rewind( ) を使用して、既に反転されたバッファ内のデータを戻って再度読み取ることができます。一般的な状況は次のとおりです。flip() を使用した後、バッファからデータを読み取り、データを再読み取りする場合、このメソッドは機能します。

于 2016-02-21T07:51:41.870 に答える
1

以下は、この 2 つが異なる結果を生成する例です。あなたが言ったように、両方とも位置を0に設定します.2つの違いは、フリップが制限を前の位置に設定することです。

したがって、flip では、書き込み ( put ) を行っていた場合、読み取り ( get ) の制限は、最後に書き込んだ要素の位置になります。それ以上読み取ろうとすると、例外がスローされます。

巻き戻しは制限を変更しません。容量 ( buffer size ) に達していると仮定すると、実際に書き込んだデータを超えて読み取りを続けることができます。この場合、バッファーが初期化された最初のゼロを読み取ります。

ByteBuffer bb = ByteBuffer.allocateDirect(2);
byte b = 127;
bb.put(b);
bb.rewind();//or flip();

System.out.println(bb.get());  // will print 127 in either case
System.out.println(bb.get());  // will print 0 for rewind, BufferUnderflow exception for flip
于 2016-09-18T18:22:46.577 に答える