2015-12-29 7 views
4

У меня есть ByteBuffer, содержащий три двойных значения, например. {1.0, 2.0, 3.0}. То, что я сейчасОт ByteBuffer до двойного массива

double[] a = new double[3]; 
for (int i = 0; i < 3; i++) { 
    a[i] = byteBuffer.getDouble(); 
} 

, который прекрасно работает, но я предпочел бы один шаг решение с помощью

double[] a = byteBuffer.asDoubleBuffer().array(); 

, но это приводит к исключению:

java.lang.UnsupportedOperationException at java.nio.DoubleBuffer.array(...) 

Что я делать не так?

ответ

4

Согласно documentation, array является необязательной операции:

public final double[] array() 

Возвращает двойной массив, который создает резервные этот буфер (дополнительная работа).

Вы можете узнать, позвонив по номеру array, позвонив по номеру hasArray().

Вы можете создать массив следующим образом:

DoubleBuffer dbuf = byteBuffer.asDoubleBuffer(); // Make DoubleBuffer 
double[] a = new double[dbuf.remaining()]; // Make an array of the correct size 
dbuf.get(a);        // Copy the content into the array 
+1

Это должен быть принятый ответ, на мой взгляд, поскольку он не только объяснил, что я ошибся, но и фактически дал рабочее решение. – BloodShura

5

Вы неправильно используете DoubleBuffer. DoubleBuffer.array() возвращает массив, который поддерживает DoubleBuffer, если и только если это вид DoubleBuffer, который поддерживается массивом. Это не так. Это подкреплено ByteBuffer. Фактически, это DoubleBuffer является просто видом оригинала ByteBuffer.

Вы можете узнать, поддерживается ли какой-либо конкретный номер ByteBuffer массивом, вызвав метод hasArray().

См. Ответ Питера Лори для кода, чтобы получить содержимое DoubleBuffer в массив из double. (Он бил меня к нему :-).)

4

DoubleBuffer имеет два режима работы: он может либо работать по распределения или как зрения. Это решено исключительно во время создания DoubleBuffer.

array() метод опционально и выбросит UnsupportedOperationException, если вы используете его с точки зрения.

В вашем случае, исходя из ByteBuffer до DoubleBuffer по методу ByteBuffer::asDoubleBuffer, вы получаете представление, как указано в Javadoc. И поскольку это представление, вы получаете исключение.

2

Вы можете скопировать в double[] с этим.

double[] doubles = new double[byteBuffer.remaining()/Double.BYTES]; 
byteBuffer.asDoubleBuffer().get(doubles); 
+2

Это та часть, которую мне не хватало. Благодаря! –

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