从 ByteBuffer 到双数组

From ByteBuffer to double array

我有一个 ByteBuffer 包含三个双精度值,例如{1.0, 2.0, 3.0}。我现在拥有的是

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(...)

我做错了什么?

您在滥用 DoubleBufferDoubleBuffer.array() returns 支持 DoubleBuffer 的数组 当且仅当 它是由数组支持的那种 DoubleBuffer .这个不是。它由 ByteBuffer 支持。其实这个DoubleBuffer只是对原ByteBuffer.

的一个看法

您可以通过调用 hasArray() 方法来查明任何特定的 ByteBuffer 是否由数组支持。

请参阅 Peter Lawrey 的答案以获取将 DoubleBuffer 的内容放入 double 数组的代码。 (他先于我。:-))

DoubleBuffer有两种模式:它可以通过分配工作,也可以作为视图工作。这是在创建 DoubleBuffer.

时专门决定的

array() 方法是 可选的 ,如果您从视图中使用它,将抛出 UnsupportedOperationException

在您的情况下,使用方法 ByteBuffer::asDoubleBufferByteBufferDoubleBuffer,您将获得一个视图,如 Javadoc 中所述。因为它是一个视图,所以你会得到异常。

根据documentationarray是一个可选操作:

public final double[] array()

Returns the double array that backs this buffer (optional operation).

您可以通过调用 hasArray() 来判断调用 array 是否正常。

你可以做一个数组如下:

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

你可以用这个复制到double[]

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