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)
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()
只返回支持数组,而不考虑偏移量,位置或限制).
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)
如果您更ByteBuffer
喜欢@kalefranz,那么总是可以byte[]
在一行中连接两个(甚至更多),如下所示:
byte[] c = ByteBuffer.allocate(a.length+b.length).put(a).put(b).array();
Run Code Online (Sandbox Code Playgroud)
小智 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)