作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在使用堆外缓冲区时,可能需要将它们复制到数组中。假设我们不知道缓冲区是关闭还是在堆上。如何填写执行?
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/
我是一名优秀的程序员,十分优秀!