ByteBuffer имеет позицию , указывающую, откуда должен быть прочитан следующий байт. Ваш метод respWithPut должен вызвать respBuf.flip () , чтобы убедиться, что позиция буфера указывает на данные, которые вы только что в него поместили.
После ByteBuffer.allocate
:
position limit
↓ ↓
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| … |_|
0 1 2 3 4 5 5 6 7 8 9 1 1 1 1 1 1 ↑
0 1 2 3 4 5 buffer size
После вызова ByteBuffer.put
, например, с байтовым массивом длины восемь:
position limit
↓ ↓
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| … |_|
0 1 2 3 4 5 5 6 7 8 9 1 1 1 1 1 1 ↑
0 1 2 3 4 5 buffer size
Следующий вызов ByteBuffer.get
прочитает байт по индексу 8, который по-прежнему равен нулю, так как вы не использовал put
для добавления каких-либо данных.
После вызова ByteBuffer.flip
предел будет старой позицией, а новая позиция будет равна нулю, что делает любые существующие данные готовыми для чтения:
next get operation will read from here
↓
position limit
↓ ↓
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| … |_|
0 1 2 3 4 5 5 6 7 8 9 1 1 1 1 1 1 ↑
0 1 2 3 4 5 buffer size