The ByteBuffer is the most generic and commonly used NIO buffer class.
How to create a ByteBuffer
As mentioned in our discussion of buffer layout,
a buffer class is generally "wrapped" around an underlying byte array. Modifying or reading from the buffer then
accesses the underlying array and vice versa. If we have a byte array, we can create a buffer object
around it by calling the ByteBuffer.wrap() method:
byte ba = ...
ByteBuffer buff = ByteArray.wrap(ba);
A less commonly used variant of wrap() allows us to wrap around a part of an array.
If we just want to create a brand new byte array and buffer object all in one go, we can call
the convenience method ByteBuffer.allocate() method, passing the required buffer and array size (in bytes):
ByteBuffer buff = ByteArray.allocate(100);
Position and limit of the buffer
Recall from our overview of the layout of a buffer that
a ByteBuffer (and other types of buffer) has a current position and limit.
When a new buffer is created:
- the position is initialised to the start of the buffer
- the limit is initialised to the size or capacity of the buffer.
In other words, a newly created buffer is set up to sequentially read or write over the entire
buffer from start to finish, unless we manually change the position and/or limit.
Reading and writing
On the next page, we'll look at the methods to read and write data
to the ByteBuffer.