2015-02-01 4 views
4

Класс java.nio.ByteBuffer имеет метод ByteBuffer.array(), однако он возвращает массив, размер которого является емкостью буфера, а не используемой емкостью. Из-за этого у меня довольно много проблем.Как получить использованный byte [] из ByteBuffer

Я заметил, что использование ByteBuffer.remaining() дает мне количество байтов, которые в настоящее время используются буфером, поэтому в основном то, что я ищу, это способ получить byte[] ТОЛЬКО используемых байтов. (т. е. байты, которые отображаются в ByteBuffer.remaining().

Я пробовал несколько разных вещей, но я, кажется, терпеть неудачу, единственное обходное решение, которое я могу придумать, чтобы создать еще один ByteBuffer с выделенным размером оставшийся буфер, а затем записать (х) байт к нему.

ответ

4

Из-за чтения Javadocs, я думаю, что остальное дает только количество байтов между текущей позицией и лимитом.

остальное()

Возвращает количество элементов между текущим положением и пределом.

Кроме того:

емкости буферной является количество элементов, которые он содержит. Объем буфера никогда не отрицателен и никогда не изменяется.

Предел буфера - это индекс первого элемента, который не следует читать или писать. Предел буфера никогда не отрицателен и никогда не превышает его емкость.

Позиция буфера - это индекс следующего элемента, который необходимо прочитать или записать. Позиция буфера никогда не является отрицательной и никогда не превышает ее предела.

Так со всем, что в виду, как об этом:

static byte[] getByteArray(ByteBuffer bb) { 
    byte[] ba = new byte[bb.limit()]; 
    bb.get(ba); 
    return ba; 
} 

Это использует get(byte[] dst) метод ByteBuffer в

общественного ByteBuffer получить (байт [] ДСТ)

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

src.get(a, 0, a.length) 
+1

Это ошибка, вы должны bb.rewind(); перед bb.get (ba); , иначе это вызовет исключение BufferUnderflowException. т. Е. Если в буфере осталось меньше байтов, чем требуется для удовлетворения запроса, то есть, если длина> остальная(), то никакие байты не передаются и исключение BufferUnderflowException –

0

Выделяют byte[] при необходимости, а затем использовать ByteBuffer.get(byte[]) или ByteBuffer.get(byte[], int, int) способ скопировать байты в массив. в зависимости от состояния ByteBuffer вам может понадобиться flip это в первую очередь.

В некоторых случаях также возможно получить поддержку луч для ByteBuffer, но это не рекомендуется ...

Для получения более подробной информации, в Javadocs являются here.

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