2

最好的方法是什么?

我尝试了以下方法:

ByteBuffer cacheBuffer=ByteBuffer.allocateDirect(nm(nLimit,0));  //where nm(nLimit,0) is a large number
double[] cache=cacheBuffer.asDoubleBuffer().array();

但我得到了这个例外:

java.lang.UnsupportedOperationException
at java.nio.DoubleBuffer.array(Unknown Source)

为什么?

编辑:

它看起来像 javadoc “返回支持此缓冲区的双精度数组(可选操作)。” 实际上意味着 array() 方法只是返回已经支持此缓冲区的双精度数组。我认为它会以某种方式将缓冲区转换为 double[] 。所以现在我有一个例外是有道理的。

4

3 回答 3

6

这仅在您希望您的数组只是一个副本时才有效。

final DoubleBuffer buffer = cacheBuffer.asDoubleBuffer();
final double[] copy = new double[buffer.remaining()];
buffer.get(copy);

您尝试失败的原因是因为array仅支持非直接缓冲区;直接缓冲区不受数组支持。

于 2012-09-01T13:32:19.180 回答
1

array() 是 Buffers 的可选操作。缓冲区实现可能/可能不支持此操作。调用 hasArray() 以检查是否支持该操作,然后相应地继续。

于 2012-09-01T13:49:27.013 回答
-2

如果你想要一个浅拷贝,使用 clone()

于 2012-09-01T13:37:35.653 回答