gpt4 book ai didi

java - 如何将 IntBuffer 复制到 int[]

转载 作者:行者123 更新时间:2023-11-29 06:50:55 24 4
gpt4 key购买 nike

在使用堆外缓冲区时,可能需要将它们复制到数组中。假设我们不知道缓冲区是关闭还是在堆上。如何填写执行?

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com