代码之家  ›  专栏  ›  技术社区  ›  Przemek

如何将IntBuffer复制到int[]

  •  1
  • Przemek  · 技术社区  · 6 年前

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

    IntBuffer b = ... // could be off or on -heap
    int[] array = toArray(b)
    
    public int[] toArray(IntBuffer b) {
        //???
    }
    
    1 回复  |  直到 6 年前
        1
  •  6
  •   Kayaman    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;
    }
    

    自从 array() 返回实际的后备数组,任何更改都会反映在缓冲区中。如果你不想那样, clone() 返回之前的数组(切片缓冲区不需要,因为 copyOfRange 用于它们)。


    这里可能有一些未经考虑的边缘案例,所以如果你发现任何,请在下面发表评论,我会给你一个(令人讨厌的)惊喜。