Я бы использовал метод ByteBuffer.wrap (). Посмотрев быстро на реализацию Cisco, которую ранее разместил г-н Дин Хиллер, вы можете заменить put () на getWriteBuffer (), который вернет вам ByteBuffer, который упаковывает часть в буфер, который он может записать.
Та же логика может быть применена к части чтения.
Преимуществом этого является отсутствие сжатия, которое может быть дорогостоящим в зависимости от количества байтов в ByteBuffer за счет усложнения логики синтаксического анализа: вы можете получить первую часть вашего сообщения для ByteBuffer, которая оборачивает последнюю область нижележащего кольцевого буфера. Чтобы получить вторую часть вашего сообщения, необходимо еще одно чтение, чтобы получить байтовый массив в начале циклического буфера, заключенного в другой ByteBuffer.