如何在不使用任何第三方库的情况下将
是否有一种使用标准库快速实现的方法?
byte[]
转换为Byte[]
,以及将Byte[]
转换为byte[]
?是否有一种使用标准库快速实现的方法?
byte[] bytes = ...;
Byte[] byteObject = ArrayUtils.toObject(bytes);
Byte[] byteObject = new Byte[0];
byte[] bytes = ArrayUtils.toPrimitive(byteObject);
ArrayUtils
不是 Java 标准包的一部分。 - Binita BharatiByte
类是 byte
基本类型的一种包装类。以下代码可实现此功能:
byte[] bytes = new byte[10];
Byte[] byteObjects = new Byte[bytes.length];
int i=0;
// Associating Byte array values with bytes. (byte[] to Byte[])
for(byte b: bytes)
byteObjects[i++] = b; // Autoboxing.
....
int j=0;
// Unboxing Byte values. (Byte[] to byte[])
for(Byte b: byteObjects)
bytes[j++] = b.byteValue();
Byte.valueOf(b)
而不是new Byte(b)
。如果Byte类没有为每个字节缓存每个值,我会感到惊讶。 - DunesByte.valueOf(byte)
。JavaDocs说,相对于构造函数Byte(byte)
,通常应该优先使用此方法,因为所有字节值都被缓存,所以这种方法可能会产生更好的空间和时间性能。 - Edwin DalorzobyteObjects[i++] = b;
。 - Code-Apprenticenew Byte[bytes.length];
代替new Byte[10];
,以使代码更加合理。 - BalusCJava 8 解决方案:
Byte[] toObjects(byte[] bytesPrim) {
Byte[] bytes = new Byte[bytesPrim.length];
Arrays.setAll(bytes, n -> bytesPrim[n]);
return bytes;
}
很遗憾,你无法通过这种方式将Byte[]
转换为byte[]
。Arrays
可以为double[]
、int[]
和long[]
提供setAll
,但对于其他原始类型则不行。
您可以使用Apache Commons Lang库中的ArrayUtils类中的toPrimitive方法,如此处所建议-Java - Byte[] to byte[]
byte[] toPrimitives(Byte[] oBytes)
{
byte[] bytes = new byte[oBytes.length];
for(int i = 0; i < oBytes.length; i++){
bytes[i] = oBytes[i];
}
return bytes;
}
反向:
//byte[] to Byte[]
Byte[] toObjects(byte[] bytesPrim) {
Byte[] bytes = new Byte[bytesPrim.length];
int i = 0;
for (byte b : bytesPrim) bytes[i++] = b; //Autoboxing
return bytes;
}
从byte[]到Byte[]:
byte[] b = new byte[]{1,2};
Byte[] B = new Byte[b.length];
for (int i = 0; i < b.length; i++)
{
B[i] = Byte.valueOf(b[i]);
}
从 Byte[] 到 byte[](使用我们之前定义的 B
):
byte[] b2 = new byte[B.length];
for (int i = 0; i < B.length; i++)
{
b2[i] = B[i];
}
private Byte[] toObjects(byte[] bytes) {
return IntStream.range(0, bytes.length)
.mapToObj(i -> bytes[i])
.toArray(Byte[]::new);
}
退一步,看看更大的画面。你卡在了将byte[]转换为Byte[]或反之亦然,因为Java对类型大小写敏感,像这样:
List< Byte> 或 List<Byte[]>
现在你有byte[]和Byte[],需要进行转换。这会有所帮助。
将所有的byte[]都保存在一个列表中,像这样:List<byte[]>,而不是List< Byte>或List<Byte[]>。(byte是一个原始类型,byte[]是一个对象)
当你获取字节时,可以这样做(网络套接字示例):
ArrayList<byte[]> compiledMessage = new ArrayList<byte[]>;
...
compiledMessage.add(packet.getData());
然后,当您想要将所有字节放入单个消息中时,请执行以下操作:
byte[] fromListOfNotByteArray (List<byte[]> list) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos;
try {
oos = new ObjectOutputStream(baos);
oos.writeObject(list);
} catch (IOException e) {
e.printStackTrace();
}
return baos.toByteArray();
}
这样,您可以将所有部分保存在List<byte[]>中,将整个部分保存在byte[]中,而无需在for循环中进行大量疯狂的复制任务,并且到处都是小baby byte[]。 ;)
现在您知道了 - 教给其他人。
自从Java 8版本以后:
byte[] bytes = new bytes[byteObject.length];
IntStream.range(0, byteObject.length).forEach(x -> bytes [x] = byteObject[x]);
Byte[]
?看起来不是一个好主意... 要么使用byte[]
或者List<Byte>
。 - DunesByte[]
转换为byte[]
。 - Dunes