从ByteBuffer到双数组

Mic*_*ner 4 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();
}
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,但我更喜欢一步到位的解决方案

double[] a = byteBuffer.asDoubleBuffer().array();
Run Code Online (Sandbox Code Playgroud)

但这导致了一个例外:

java.lang.UnsupportedOperationException at java.nio.DoubleBuffer.array(...)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Eri*_*rom 6

你在滥用DoubleBuffer.DoubleBuffer.array()返回支持DoubleBuffer if的数组,仅当它是DoubleBuffer由数组支持的数组时才返回.这个不是.它有一个支持ByteBuffer.实际上,这DoubleBuffer只是对原作的看法ByteBuffer.

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

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


das*_*ght 6

根据文档,array是一个可选操作:

public final double[] array()
Run Code Online (Sandbox Code Playgroud)

返回支持此缓冲区的double数组(可选操作).

您可以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
Run Code Online (Sandbox Code Playgroud)