2013-06-02 8 views
9

Ich habe eine ByteBuffer, die ein Maximum von (4 + size) bytes (dh eine ganze Zahl gefolgt von size Zeichen) halten kann. Die Anzahl der Zeichen, die in ByteBuffer geschrieben werden, kann jedoch kleiner als size sein.Anzahl der Bytes in ByteBuffer bestimmen

Also ich frage mich, gibt es sowieso zu bestimmen, wie viele Zeichen wurden geschrieben, die ByteBuffer und nicht nur die Gesamtgröße davon? limit, position und solche scheinen nicht zu sein, was ich bin.

Danke für Ihre Hilfe!

+0

Was ist 'hasRemaining'? –

+0

'hasRemaining' gibt einen booleschen Wert zurück, der anzeigt, ob noch etwas übrig ist, nicht wieviele Bytes übrig sind. –

Antwort

18

Nachdem Sie in den ByteBuffer geschrieben haben, kann die Anzahl der Bytes, die Sie geschrieben haben, mit der position() Methode gefunden werden.

Wenn Sie dann flip() den Puffer, die Anzahl der Bytes im Puffer kann mit den limit() oder remaining() Methoden gefunden werden.

Wenn Sie dann einen Teil des Puffers lesen, kann die Anzahl der verbleibenden Bytes mit der Methode remaining() ermittelt werden.

+0

Danke Andy. Vielleicht ist das Problem, dass ich 'wrap' verwendet habe, um ein' byte [] 'in den Puffer zu kopieren? Ist das mit meiner Verwendung der Funktionen, die du erwähnt hast, nicht in Ordnung? Wenn ja, gibt es eine Möglichkeit, die tatsächliche Anzahl der Bytes, die in das Byte [] 'geschrieben wurden, zu lesen? Danke für Ihre Hilfe. –

+0

@Girl Sie können die tatsächliche Anzahl geschriebener Bytes nicht wissen, da 'ByteBuffer' im Wesentlichen" suchbar "ist. Was ist dein Schreibmuster? Verwenden Sie nur absolute Lese-/Schreibmethoden, relative Lese-/Schreibmethoden? – fge

+0

@fge Ich lese im Wesentlichen von einem 'DatagrampPacket'. Ich weiß, dass die MAX-Größe des Inhalts im 'DatagramPacket'' 4 + size' ist. Es ist jedoch möglich, dass die Anzahl der Zeichen nach "int" kleiner als "size" sein kann. Ich versuche also herauszufinden, wie viele Zeichen tatsächlich im 'DatagramPacket' waren. Danke für deine Hilfe. –

2
DatagramChannel channel = DatagramChannel.open(); 
ByteBuffer bb = ByteBuffer.allocate(5+size); 
channel.receive(bb); 
bb.flip(); 
// actual length of received packet 
int len = bb.remaining();