连接两个字节数组的简便方法

and*_*Guy 235 java arrays concatenation

连接两个byte数组的简单方法是什么?

说,

byte a[];
byte b[];
Run Code Online (Sandbox Code Playgroud)

如何连接两个byte数组并将其存储在另一个byte数组中?

小智 344

最优雅的方法是使用ByteArrayOutputStream.

byte a[];
byte b[];

ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
outputStream.write( a );
outputStream.write( b );

byte c[] = outputStream.toByteArray( );
Run Code Online (Sandbox Code Playgroud)

  • @vipw这是优雅的原因是因为如果/当你希望以后连接第三个数组时,你只需添加行`outputStream.write(c);` - 你不必返回并编辑其中的行您创建结果字节数组.此外,与使用arraycopy方法不同,重新排序数组很简单. (58认同)
  • 如果考虑内存消耗和/或性能,请务必使用`a.length + b.length`作为`ByteArrayOutputStream`构造函数的参数.请注意,此方法仍将所有字节复制到新数组以分配给`c []`!考虑`ByteBuffer`方法是一个紧密的竞争者,不会浪费内存. (5认同)
  • 是否浪费cpu和内存取决于你操作的频率.如果它是每秒十亿次 - 确保优化它.否则,可读性和可维护性可能是获胜的考虑因素. (3认同)
  • 此外,使用超过2个字节的数组时,这要容易得多. (2认同)
  • 我真的不能对此竖起大拇指,因为这只是一个代码片段。这里没有对底层部分的解释,这是我关心的部分(我想大多数人都会这样做)。如果对 System#arrayCopy(Object, int, Object, int, int) 和 ByteArrayOutputStream#put(byte[]) 之间进行性能比较,并详细说明哪种情况最适合这两个选项,我会很乐意对此竖起大拇指。另外,话虽这么说,答案还应该包括 arrayCopy,因为这是另一个解决方案。 (2认同)

Jon*_*han 303

最简单的:

byte[] c = new byte[a.length + b.length];
System.arraycopy(a, 0, c, 0, a.length);
System.arraycopy(b, 0, c, a.length, b.length);
Run Code Online (Sandbox Code Playgroud)


Zol*_*tán 63

下面是一个使用很好的解决方案番石榴com.google.common.primitives.Bytes:

byte[] c = Bytes.concat(a, b);
Run Code Online (Sandbox Code Playgroud)

这个方法的好处是它有一个varargs签名:

public static byte[] concat(byte[]... arrays)
Run Code Online (Sandbox Code Playgroud)

这意味着您可以在单个方法调用中连接任意数量的数组.


kal*_*anz 28

另一种可能性是使用java.nio.ByteBuffer.

就像是

ByteBuffer bb = ByteBuffer.allocate(a.length + b.length + c.length);
bb.put(a);
bb.put(b);
bb.put(c);
byte[] result = bb.array();

// or using method chaining:

byte[] result = ByteBuffer
        .allocate(a.length + b.length + c.length)
        .put(a).put(b).put(c)
        .array();
Run Code Online (Sandbox Code Playgroud)

请注意,数组的大小必须适当,因此需要分配行(因为array()只返回支持数组,而不考虑偏移量,位置或限制).

  • @click_whir对不起男人,但ReadTheDocs.`ByteBuffer.allocate(int)`是一个静态方法,它返回一个实例化的`java.nio.HeapByteBuffer`,它是`ByteBuffer`的子类.`.put()`和`.compact()`方法 - 以及任何其他抽象方法 - 都得到了解决. (3认同)

Way*_*oda 13

另一种方法是使用实​​用程序函数(如果您愿意,可以将其设置为泛型实用程序类的静态方法):

byte[] concat(byte[]...arrays)
{
    // Determine the length of the result array
    int totalLength = 0;
    for (int i = 0; i < arrays.length; i++)
    {
        totalLength += arrays[i].length;
    }

    // create the result array
    byte[] result = new byte[totalLength];

    // copy the source arrays into the result array
    int currentIndex = 0;
    for (int i = 0; i < arrays.length; i++)
    {
        System.arraycopy(arrays[i], 0, result, currentIndex, arrays[i].length);
        currentIndex += arrays[i].length;
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

像这样调用:

byte[] a;
byte[] b;
byte[] result = concat(a, b);
Run Code Online (Sandbox Code Playgroud)

它也适用于连接3,4,5阵列等.

这样做可以为您提供快速阵列代码的优势,该代码也非常易于阅读和维护.


Tom*_*ski 11

您可以使用第三方库来清理代码,例如Apache Commons Lang,并使用它:

byte[] bytes = ArrayUtils.addAll(a, b);
Run Code Online (Sandbox Code Playgroud)


Jam*_*.Xu 10

byte[] result = new byte[a.length + b.length];
// copy a to result
System.arraycopy(a, 0, result, 0, a.length);
// copy b to result
System.arraycopy(b, 0, result, a.length, b.length);
Run Code Online (Sandbox Code Playgroud)


ZEu*_*EuS 9

如果您更ByteBuffer喜欢@kalefranz,那么总是可以byte[]在一行中连接两个(甚至更多),如下所示:

byte[] c = ByteBuffer.allocate(a.length+b.length).put(a).put(b).array();
Run Code Online (Sandbox Code Playgroud)

  • 与[这个](/sf/answers/1107769001/)的答案相同,但晚了一年多。使用方法链接,但这最好放入现有答案中。 (2认同)

小智 5

对于两个或多个数组,可以使用这种简单而干净的实用方法:

/**
 * Append the given byte arrays to one big array
 *
 * @param arrays The arrays to append
 * @return The complete array containing the appended data
 */
public static final byte[] append(final byte[]... arrays) {
    final ByteArrayOutputStream out = new ByteArrayOutputStream();
    if (arrays != null) {
        for (final byte[] array : arrays) {
            if (array != null) {
                out.write(array, 0, array.length);
            }
        }
    }
    return out.toByteArray();
}
Run Code Online (Sandbox Code Playgroud)