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

标签 java nio

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

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/

相关文章:

Java字符串通过黑名单验证

java - 如何旋转SeekBar上的TextView?

Java NIO - 内存映射文件

hadoop - 使用hadoop文件系统org.apache.hadoop.fs.FileSystem写二进制文件

java - 如何在java中的FileWacther中查看多个硬盘分区

java - 添加到具有 `cascade="的集合后,在 Hibernate 中保存对象时发生 TransientObjectException,删除孤儿"`

java - Google Drive API 抛出 userRateLimitExceeded 然后 dailyLimitExceededUnreg

java - 将文件写入 ServletOutputStream 的最有效方法

java - 如何从网站下载文件?

java - 如何在java中的elasticsearch按距离排序中设置Ignore_unmapped true?