在使用堆外缓冲区时,可能需要将它们复制到数组中。 假设我们不知道缓冲区是关闭还是在堆上。 如何填写执行?
IntBuffer b = ... // could be off or on -heap
int[] array = toArray(b)
public int[] toArray(IntBuffer b) {
//???
}
最佳答案
以下代码应该适用于直接缓冲区和数组支持缓冲区。
它还应该考虑共享缓冲区,例如将缓冲区 [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()
返回实际的后备数组,任何更改都会反射(reflect)在缓冲区中。如果您不希望这样,请在返回之前clone()
数组(切片缓冲区不需要,因为它们使用了copyOfRange
)。
那里可能有一些未考虑的边缘情况,所以如果您发现任何情况,请在下面发表评论,我会给您一个(令人讨厌的)惊喜。
关于java - 如何将 IntBuffer 复制到 int[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48584616/