【问题标题】:Copy several byte arrays to one big byte array将几个字节数组复制到一个大字节数组
【发布时间】:2011-01-28 11:19:30
【问题描述】:

我有一个大的byte[] 数组和很多小的byte 数组(大数组的长度是小数组的长度之和)。是否有一些快速的方法可以将一个数组从起始位置复制到另一个数组,而不是手动为每个字节使用 for 循环?

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    您可以使用ByteBuffer

    ByteBuffer target = ByteBuffer.wrap(bigByteArray);
    target.put(small1);
    target.put(small2);
    ...;
    

    【讨论】:

    • 很确定这会在内部使用类似的代码,正如其他答案所建议的那样。赞成,使用内置方法通常比重新发明轮子更好。
    • 投反对票。这不考虑在交付第一个部分数组时大数组的最终长度未知的情况。
    • @Zom-B 问题以“我有一个大字节数组”开头,所以看起来数组的大小是事先知道的。
    • 使用ByteBuffer.allocate(size),如果你需要给定size的数组,但还没有。然后,在所有 target.put() 调用之后调用 target.getArray()
    【解决方案2】:

    使用System.arraycopy()

    您也可以应用来自a previous answer of mine 的解决方案。请注意,对于 byte 这样的原始类型,您必须生成单独的版本(每种原始类型一个),因为泛型在那里不起作用。

    【讨论】:

    • +1 表示您之前的答案。如果您让它接受对象参数而不是两个 T[],它也适用于原始类型。但这当然意味着没有编译时检查。
    • @Sean:不幸的是,没有Arrays.copyOf() 需要Object
    • 啊,和System.arrayCopy()混淆了
    • 似乎很奇怪这是System 方法!
    【解决方案3】:

    或者您可以使用ByteArrayOutputStream(尽管它会为您创建结果数组,而不是按照您的要求复制到现有数组中)。

    public byte[] concatenateByteArrays(List<byte[]> blocks) {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        for (byte[] b : blocks) {
            os.write(b, 0, b.length);
        }
        return os.toByteArray();
    }
    

    【讨论】:

    【解决方案4】:

    示例实现

    public static void copySmallArraysToBigArray(final byte[][] smallArrays,
        final byte[] bigArray){
        int currentOffset = 0;
        for(final byte[] currentArray : smallArrays){
            System.arraycopy(
                currentArray, 0,
                bigArray, currentOffset,
                currentArray.length
            );
            currentOffset += currentArray.length;
        }
    }
    

    测试代码

    public static void main(final String[] args){
        final byte[][] smallArrays =
            {
               "The"    .getBytes(),
               " Quick" .getBytes(),
               " Brown" .getBytes(),
               " Fox"   .getBytes()
            };
        final byte[] bigArray = "The Small Mauve Cat".getBytes();
        copySmallArraysToBigArray(smallArrays, bigArray);
        System.out.println(new String(bigArray));
    }
    

    输出:

    快速的棕色狐狸

    【讨论】:

    • 我会删除检查并抛出异常,因为当索引超出范围时System.arraycopy() 已经抛出IndexOutOfBoundsException(并且该异常也提供了更多信息) .
    • @sean: 请在下一个示例中使用 getBytes(Charset.forName("ASCII")) 或类似的(因为 getBytes() 取决于字符编码的运行时系统)
    【解决方案5】:

    这是另一个同样使用ByteBuffer的解决方案:

    public static byte[] toByteArray(List<byte[]> bytesList)
    {
        int size = 0;
    
        for (byte[] bytes : bytesList)
        {
            size += bytes.length;
        }
    
        ByteBuffer byteBuffer = ByteBuffer.allocate(size);
    
        for (byte[] bytes : bytesList)
        {
            byteBuffer.put(bytes);
        }
    
        return byteBuffer.array();
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2015-03-19
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 2011-04-08
      相关资源
      最近更新 更多