2016-02-05 14 views
5

私はJava NIOを初めて使用しており、nio-ishlyの処理方法がわかりません。ByteBufferから残りのバイト(Java NIO)を1バイトだけ取得する方法

ByteBufferのgetメソッドを使用して、ソケットの一部のデータをByteBufferに読み込み、1つを除いてすべてのバイトを消費したとします。私は次のものがバイナリ形式の整数を持つ4バイトであることを知っているので、getInt()を使用したいが、intの最初のバイトだけがバッファにある。

私にとって自然なことは、接続からさらに多くのバイトでバッファをいっぱいにしてから続行することです。私が正しく理解すれば、私はこれを達成することができました

buf.compact(); 
buf.position(buf.limit()); 
buf.limit(buf.capacity()); 

そして、それ以上のバイトを読んでください。

この動作ではメソッドはありませんが、flip()メソッドがあるので、私の考えが間違っているのだろうかと思います。これを行うより良い方法はありますか?

この状況は自然に発生します。接続が長さ+データメッセージのストリームを配信する場合

+0

ノープノープではありません。慎重に質問を読んでください...これはソケットから入ってきてバッファリングされているデータなので、整数の最初のバイトが "分離"されてしまいます。しかし、他のバイトが来ているので、1バイトを読み込んでキャストするのは間違いでしょう。 OPが望んでいるのは、他の3バイトがわかるまで、そのバイトにハングアップすることです。 – dcsohl

+0

@dcsohlあなたは間違いです。 – Pooya

+1

'compact()'の後、バッファはより多くのバイトを読み込めるように設定されています。もう一度バイトが読み込まれると、 'flip()'と読み込まれます。 –

答えて

2
buf.compact(); 
// wrong: buf.position(buf.limit()); 
// no need to: buf.limit(buf.capacity()); 

位置を変更しないでください。 compact()の後の位置は、バッファの未取得部分の後の最初のバイトを指しています。

容量の制限は冗長です:compact()はすでにあなたのためにしています。

関連する問題