从ByteBuffer到双精度数组

4

我有一个包含三个double值的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(...)

我哪里出了问题?

4个回答

7
根据文档array是一个可选操作。
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

1
在我看来,这应该是被接受的答案,因为它不仅解释了我的错误,而且还提供了一个可行的解决方案。 - João Vitor Verona Biazibetti

6
您误用了DoubleBuffer。如果它是由数组支持的那种DoubleBuffer,则DoubleBuffer.array()返回支持该DoubleBuffer的数组。但是这个DoubleBuffer不是由数组支持的, 而是由一个ByteBuffer支持的。实际上,这个DoubleBuffer只是原始ByteBuffer的一个视图。
您可以通过调用hasArray()方法来查找任何特定的ByteBuffer是否由数组支持。
请参见Peter Lawrey的答案,以获取将DoubleBuffer的内容转换为double数组的代码。(他比我快:-))

4
双缓冲区有两种模式:它可以通过分配或作为视图工作。这是在创建DoubleBuffer时独家决定的。
array()方法是可选的,如果从视图中使用它,则会抛出UnsupportedOperationException异常。
在您的情况下,使用ByteBuffer :: asDoubleBuffer方法从ByteBuffer到DoubleBuffer转换时,如Javadoc中所述,您会获得一个视图。由于它是一个视图,因此您会收到异常。

2

你可以使用以下代码将内容复制到一个double[]数组中。

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

2
那就是我缺失的部分。谢谢! - Erick G. Hagstrom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接