使用off heap buffers时,可能需要将它们复制到数组中。 让我们假设我们不知道缓冲区是关闭还是堆栈。 如何填写实施?
IntBuffer b = ... // could be off or on -heap
int[] array = toArray(b)
public int[] toArray(IntBuffer b) {
//???
}
答案 0 :(得分:6)
以下代码适用于直接缓冲区和数组支持的缓冲区。
它还应该考虑共享缓冲区,例如,一半的缓冲区var myObject = new ObjectWithMultipleProps
{
Prop1 = "",
Prop2 = 0,
Prop3 = "",
...etch
}
允许您在两个缓冲区切片上调用[0, 1, 2, 3]
并返回您期望的内容。
它将复制该特定缓冲区的全部内容(无论是否切片),而不考虑位置或限制。它对非阵列支持的缓冲区有很多副作用,所以不要写这样的代码(至少记录副作用)。
toArray()
因为public int[] toArray(IntBuffer b) {
if(b.hasArray()) {
if(b.arrayOffset() == 0)
return b.array();
return Arrays.copyOfRange(b.array(), b.arrayOffset(), b.array().length);
}
b.rewind();
int[] foo = new int[b.remaining()];
b.get(foo);
return foo;
}
返回实际的后备数组,所以任何更改都会反映在缓冲区中。如果您不希望这样,请在返回之前array()
数组(切片缓冲区不需要,因为clone()
用于它们)。
那里可能存在一些未经考虑的边缘情况,所以如果你发现任何情况,请在下方发表评论,我会以(令人讨厌的)惊喜奖励你。