从 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(...)
我做错了什么?
您在滥用 DoubleBuffer
。 DoubleBuffer.array()
returns 支持 DoubleBuffer
的数组 当且仅当 它是由数组支持的那种 DoubleBuffer
.这个不是。它由 ByteBuffer
支持。其实这个DoubleBuffer
只是对原ByteBuffer
.
的一个看法
您可以通过调用 hasArray()
方法来查明任何特定的 ByteBuffer
是否由数组支持。
请参阅 Peter Lawrey 的答案以获取将 DoubleBuffer
的内容放入 double
数组的代码。 (他先于我。:-))
DoubleBuffer
有两种模式:它可以通过分配工作,也可以作为视图工作。这是在创建 DoubleBuffer
.
时专门决定的
array()
方法是 可选的 ,如果您从视图中使用它,将抛出 UnsupportedOperationException
。
在您的情况下,使用方法 ByteBuffer::asDoubleBuffer
从 ByteBuffer
到 DoubleBuffer
,您将获得一个视图,如 Javadoc 中所述。因为它是一个视图,所以你会得到异常。
根据documentation,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
你可以用这个复制到double[]
。
double[] doubles = new double[byteBuffer.remaining() / Double.BYTES];
byteBuffer.asDoubleBuffer().get(doubles);
我有一个 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(...)
我做错了什么?
您在滥用 DoubleBuffer
。 DoubleBuffer.array()
returns 支持 DoubleBuffer
的数组 当且仅当 它是由数组支持的那种 DoubleBuffer
.这个不是。它由 ByteBuffer
支持。其实这个DoubleBuffer
只是对原ByteBuffer
.
您可以通过调用 hasArray()
方法来查明任何特定的 ByteBuffer
是否由数组支持。
请参阅 Peter Lawrey 的答案以获取将 DoubleBuffer
的内容放入 double
数组的代码。 (他先于我。:-))
DoubleBuffer
有两种模式:它可以通过分配工作,也可以作为视图工作。这是在创建 DoubleBuffer
.
array()
方法是 可选的 ,如果您从视图中使用它,将抛出 UnsupportedOperationException
。
在您的情况下,使用方法 ByteBuffer::asDoubleBuffer
从 ByteBuffer
到 DoubleBuffer
,您将获得一个视图,如 Javadoc 中所述。因为它是一个视图,所以你会得到异常。
根据documentation,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
你可以用这个复制到double[]
。
double[] doubles = new double[byteBuffer.remaining() / Double.BYTES];
byteBuffer.asDoubleBuffer().get(doubles);