Java 如何将字节[]转换为字节[],反之亦然?
在不使用任何第三方库的情况下,如何将Java 如何将字节[]转换为字节[],反之亦然?,java,arrays,byte,boxing,Java,Arrays,Byte,Boxing,在不使用任何第三方库的情况下,如何将字节[]转换为字节[],以及字节[]转换为字节[] 是否有一种方法可以使用标准库快速完成此操作?Byte类是原语Byte的包装器。这应该可以完成以下工作: byte[] bytes = new byte[10]; Byte[] byteObjects = new Byte[bytes.length]; int i=0; // Associating Byte array values with bytes. (byte[] to Byte[]) fo
字节[]
转换为字节[]
,以及字节[]
转换为字节[]
是否有一种方法可以使用标准库快速完成此操作?
Byte
类是原语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[] 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]);
}
您可以在Apache Commons lang库ArrayUtils类中使用toPrimitive方法, 正如这里所建议的-Java 8解决方案:
Byte[] toObjects(byte[] bytesPrim) {
Byte[] bytes = new Byte[bytesPrim.length];
Arrays.setAll(bytes, n -> bytesPrim[n]);
return bytes;
}
不幸的是,您无法将字节[]
转换为字节[]
<代码>数组对双[]
、int[]
和长[]
具有设置所有
,但不适用于其他基元类型。字节[]对字节[]:
byte[] bytes = ...;
Byte[] byteObject = ArrayUtils.toObject(bytes);
字节[]到字节[]:
Byte[] byteObject = new Byte[0];
byte[] bytes = ArrayUtils.toPrimitive(byteObject);
如果有人喜欢流API而不是普通循环
private Byte[] toObjects(byte[] bytes) {
return IntStream.range(0, bytes.length)
.mapToObj(i -> bytes[i])
.toArray(Byte[]::new);
}
10个问题,一个被接受?不好为什么你需要/有一个
字节[]
?这似乎不是个好主意。。。使用byte[]
或List
。如果值可以为null,则可能会很有用,尽管可能不是很有效(例如,由于所有对象引用,浪费了存储字节的任何空间优势)?但是如果有null引用,则无法将byte[]
转换为byte[]
。@BalusC ok,第1页,共7页。没有多大进步!肯定会推荐Byte.valueOf(b)
overnewbyte(b)
。如果Byte类没有为一个字节缓存每个值,我会感到惊讶。我相信使用Byte.valueOf(Byte)
可能会更好。JavaDocs说,这种方法通常应该优先于构造函数字节(Byte)
,因为这种方法可能会产生更好的空间和时间性能,因为所有字节值都是缓存的代码>我会使用新字节[bytes.length]代码>而不是新字节[10]
为了保持它的合理性。@Juvanis aha,我看到您在for循环中使用了两个“计数器”:一个用于迭代基本字节数组和/或字节对象数组,另一个用于增加基本字节数组和/或字节对象数组的索引。对我来说,这是一个坏习惯。如果此代码由其他人维护,并且有人将计数器“i”从0修改为另一个值,或者将i++更改为++i,则索引将不再匹配。我不主张任何人首先修改代码,但这是初学者常见的陷阱。我的建议是保持两个数组的索引同步。这实际上是最好的答案,至少对于那些不需要向commons lang添加依赖项的人来说是这样。为什么这不是最好的答案?有什么性能方面的原因吗?或者稍后再回答?因为ArrayUtils不是Java的一部分,而是ApacheLib。我同意@mvorisek,这应该是最好的答案。只需添加org.apache.commons.lang3.ArrayUtils幸运的是,ArrayUtils
不是标准Java包的一部分。反过来说,我认为您无法从流中获取byte[]。流api有mapToInt()、mapToDouble()和mapToLong()方法,但没有mapToByte()。这对我来说是最好的答案。代码简单,没有第三方库。
byte[] bytes = ...;
Byte[] byteObject = ArrayUtils.toObject(bytes);
Byte[] byteObject = new Byte[0];
byte[] bytes = ArrayUtils.toPrimitive(byteObject);
private Byte[] toObjects(byte[] bytes) {
return IntStream.range(0, bytes.length)
.mapToObj(i -> bytes[i])
.toArray(Byte[]::new);
}