The java.nio.ByteBuffer
class has a ByteBuffer.array()
method, however this returns an array that is the size of the buffer's capacity, and not the used capacity. Due to this, I'm having some issues.
I have a ByteBuffer which I am allocating as some size and then I am inserting data to it.
ByteBuffer oldBuffer = ByteBuffer.allocate(SIZE);
addHeader(oldBuffer, pendingItems);
newBuffer.flip();
oldBuffer.put(newBuffer);
// as of now I am sending everything from oldBuffer
send(address, oldBuffer.array());
How can I just send what is being used in oldBuffer
. Is there any one liner to do this?
You can flip the buffer, then create a new array with the remaining size of the buffer and fill it.
oldBuffer.flip();
byte[] remaining = new byte[oldBuffer.remaining()];
oldBuffer.get(remaining);
Another way in a one liner with flip()
and Arrays.copyOf
oldBuffer.flip();
Arrays.copyOf(oldBuffer.array(), oldBuffer.remaining());
And without flip()
Arrays.copyOf(oldBuffer.array(), oldBuffer.position());
Also like EJP said, if you have access to the send(..)
method, you can add a size and offset argument to the send()
method, and avoid the need to create and fill a new array.
The position()
of the buffer indicates that the amount of used data in the buffer.
So create a byte array of that size.
Next go to the position 0 of the buffer, since you have to read data from there. rewind()
does this.
Then use the get()
method to copy the buffer data into the array.
byte[] data = new byte[buffer.position()];
buffer.rewind();
buffer.get(data);
Also note that buffer.array()
works only if the buffer.hasArray()
returns true. So check for hasArray()
before calling it. Otherwise, buffer.array()
will throw any of the following exception.
UnsupportedOperationException
- when calling it on direct buffer.ReadOnlyBufferException
- if the buffer is read-only.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With