如何将IntBuffer复制到int []

Prz*_*mek 1 java nio

使用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)

Kay*_*man 6

以下代码应适用于直接缓冲区和阵列支持的缓冲区.

它还应该考虑共享缓冲区,例如[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它们用于它们).


那里可能存在一些未经考虑的边缘情况,所以如果你发现任何情况,请在下面发表评论,我将以(令人讨厌的)惊喜奖励你.