使用off heap buffers时,可能需要将它们复制到数组中.假设我们不知道缓冲区是关闭还是堆栈.如何填写实施?
IntBuffer b = ... // could be off or on -heap
int[] array = toArray(b)
public int[] toArray(IntBuffer b) {
//???
}
Run Code Online (Sandbox Code Playgroud)
以下代码应适用于直接缓冲区和阵列支持的缓冲区.
它还应该考虑共享缓冲区,例如[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;
}
Run Code Online (Sandbox Code Playgroud)
因为array()返回实际的后备数组,所以任何更改都会反映在缓冲区中.如果您不希望这样,clone()则在返回数组之前(切片缓冲区不需要,因为copyOfRange它们用于它们).
那里可能存在一些未经考虑的边缘情况,所以如果你发现任何情况,请在下面发表评论,我将以(令人讨厌的)惊喜奖励你.