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

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

说,

byte a[]; byte b[]; 

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

最直截了当的:

 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); 

最好的方法是使用ByteArrayOutputStream。

 byte a[]; byte b[]; ByteArrayOutputStream outputStream = new ByteArrayOutputStream( ); outputStream.write( a ); outputStream.write( b ); byte c[] = outputStream.toByteArray( ); 

这是一个很好的解决scheme,使用Guava的com.google.common.primitives.Bytes

 byte[] c = Bytes.concat(a, b); 

这个方法的好处在于它的签名是

 public static byte[] concat(byte[]... arrays) 

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

另一种可能是使用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(); 

请注意,数组的大小必须适当,以便从头开始,因此分配行是必需的(因为array()只是返回后备数组,而不考虑偏移,位置或限制)。

 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); 

另一种方法是使用一个实用程序function(如果你喜欢,你可以把它变成一个通用实用程序类的静态方法):

 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; } 

像这样调用:

 byte[] a; byte[] b; byte[] result = concat(a, b); 

它也可以连接3,4,5个数组等。

这样做可以使您快速读取和维护数组代码的优点。

如果你喜欢ByteBuffer像@kalefranz那样,总是有可能在一行中连接两个byte[] (或者甚至更多),如下所示:

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

两个System.arraycopy调用是精简和平均的,但不容易在眼睛(更难以理解为代码审查,这是)。

使用java.nio.ByteBuffer更可读的方法:

 byte[] ab = ByteBuffer.wrap(new byte[a.length + b.length]).put(a).put(b).array(); 

您可以使用像Apache Commons Lang这样的Clean Code的第三方库,并使用它:

 byte[] bytes = ArrayUtils.addAll(a, b); 

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

 /** * 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(); } 

合并两个PDF字节数组

如果你正在合并两个包含PDF的字节数组,这个逻辑将不起作用。 我们需要使用Apache等PDFbox这样的第三方工具:

 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); mergePdf.addSource(new ByteArrayInputStream(a)); mergePdf.addSource(new ByteArrayInputStream(b)); mergePdf.setDestinationStream(byteArrayOutputStream); mergePdf.mergeDocuments(); c = byteArrayOutputStream.toByteArray(); 

这是我的方式来做到这一点!

 public static byte[] concatByteArrays(byte[]... inputs) { int i = 0; for (byte[] b : inputs) { i += b.length; } byte[] r = new byte[i]; i = 0; for (byte[] b : inputs) { System.arraycopy(b, 0, r, i, b.length); i += b.length; } return r; }