从ByteBuffer到双数组

时间:2015-12-29 14:28:04

标签: java nio bytebuffer nio2

我有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 个答案:

答案 0 :(得分:6)

根据documentationarray是一项可选操作:

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 :(得分:5)

你在滥用DoubleBufferDoubleBuffer.array()返回支持DoubleBuffer 的数组,当且仅当是由数组支持的DoubleBuffer类型时。这个不是。它由ByteBuffer支持。实际上,此DoubleBuffer只是原始ByteBuffer的视图。

您可以通过调用ByteBuffer方法找出数组是否支持任何特定hasArray()

请参阅Peter Lawrey关于将DoubleBuffer的内容转换为double数组的代码的答案。 (他打败了我。:-))

答案 2 :(得分:4)

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

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

在您的情况下,使用ByteBuffer方法从DoubleBufferByteBuffer::asDoubleBuffer,您将获得一个视图,如Javadoc中所述。而且由于它是一个观点,你得到例外。

答案 3 :(得分:2)

您可以使用此功能复制到double[]

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