简单的方法来连接两个字节数组
什么是连接两个字节数组的简单方法?
说,
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; }