2015-11-27 4 views
0

У меня есть объект ByteBuffer под названием msg с предполагаемой длины сообщения в течение первых четырех байтов, которые я прочитал следующим образом:Чтение первых четырех байтов из ByteBuffer, а затем их запись?

int msgLen = msg.getInt(); 
    LOG.debug("Message size: " + msgLen); 

Если msgLen меньше некоторого порогового значения, у меня есть частичное сообщение и необходимость кэш. В этом случае я хотел бы вернуть эти первые четыре байта в начало сообщения; то есть положите сообщение вместе, чтобы быть идентичным предварительному чтению. Например:

if (msgLen < threshold) { 
    msg.rewind(); 
    msg.put(msgLen); 

К сожалению, это не похоже на правильный способ сделать это. Я пробовал много комбинаций флип, ставить и перематывать, но должен быть недоразумением.

Как бы поместить байты обратно в буфер записи в их первоначальном порядке?

+0

Непонятно, почему вы должны «положить» эти байты «назад»? Если вы перематываете назад, вы уже попрошайничали 'msg', полученные байты не удаляются из буфера. – Andremoniy

+0

Если мой поток не смог перемотать, это вызовет ошибку, не так ли? Мой отладчик показывает, что операция перемотки перезагружает позицию. Andremoniy, спасибо, я думал, что байты были израсходованы на чтение. Все еще не получая намеченного поведения, но, возможно, это на моем конце. –

+0

@GuillaumeF. ByteBuffers не являются потоками – fge

ответ

0

Отвечено автором Andremoniy в разделе комментариев. Операции чтения не потребляют байты в буфере, поэтому msg.rewind() был адекватным. Это не сработало в моем случае из-за какой-то другой логики в программе, и я неправильно связал это с проблемой на уровне буфера.

Смежные вопросы