我有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(...)
我做错了什么?
答案 0 :(得分:6)
根据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 :(得分:5)
你在滥用DoubleBuffer
。 DoubleBuffer.array()
返回支持DoubleBuffer
的数组,当且仅当是由数组支持的DoubleBuffer
类型时。这个不是。它由ByteBuffer
支持。实际上,此DoubleBuffer
只是原始ByteBuffer
的视图。
您可以通过调用ByteBuffer
方法找出数组是否支持任何特定hasArray()
。
请参阅Peter Lawrey关于将DoubleBuffer
的内容转换为double
数组的代码的答案。 (他打败了我。:-))
答案 2 :(得分:4)
DoubleBuffer
有两种模式:它可以通过分配工作,也可以作为视图工作。这仅在创建DoubleBuffer
时确定。
array()
方法可选,如果您从视图中使用它,则会抛出UnsupportedOperationException
。
在您的情况下,使用ByteBuffer
方法从DoubleBuffer
到ByteBuffer::asDoubleBuffer
,您将获得一个视图,如Javadoc中所述。而且由于它是一个观点,你得到例外。
答案 3 :(得分:2)
您可以使用此功能复制到double[]
。
double[] doubles = new double[byteBuffer.remaining() / Double.BYTES];
byteBuffer.asDoubleBuffer().get(doubles);