我有一个byte[]
,我想创建一个字节流。
对于int[]
和long
和double
,我在Arrays类中看到了一些方法:
Arrays.stream(int[] array)
Arrays.stream(long[] array)
Arrays.stream(double[] array)
但是,方法Arrays.stream(byte[] array)
没有任何显示。
那么将字节基元流作为实际字节获取的最简单,最简洁的方法是什么?
我需要对byte []进行转换,并且需要使用所有Stream函数来进行字节流转换(不,我不想将它们全部转换为int。)
谁有一个好的解决方案?
PS。有人从微控制器API向我提供了byte [] ...因此,如果不需要,我不想使用其他数据类型。
谢谢。
答案 0 :(得分:4)
Stream<Byte>
与原始ByteStream大约一样好,因为Byte#valueOf
返回装箱值的缓存实例(编译器为您处理装箱和拆箱)。因此,唯一的技巧就是将您的byte[]
变成Stream<Byte>
。
一种方法是创建一个索引IntStream
,然后将这些索引映射到byte[]
的查找中:
byte[] byteArray = "hello".getBytes();
Stream<Byte> byteStream = IntStream.range(0, byteArray.length)
.mapToObj(i -> byteArray[i]);
我不知道JDK中有任何帮助您的辅助方法。
答案 1 :(得分:1)
您可以这样做。
byte[] a = { 1, 2, 3, 4
};
byteStream(a).forEach(System.out::println);
public static IntStream byteStream(byte[] a) {
return IntStream.range(0, a.length).map(idx -> a[idx]);
}
public static byte[] toByteArray(IntStream b) {
Byte[] barray = b.map(a->a&0xFF).boxed().toArray(Byte[]::new);
byte[] ret = new byte[barray.length];
System.arraycopy(barray,0,ret,0,barray.length);
return ret;
}
否则,由于不存在byte,float和short的原始实现,因此您可能需要将Steam与Byte一起使用。我相信Guava
支持字节流。
答案 2 :(得分:0)
您可以这样做
byte[] byteArray = "Hello World".getBytes();
Stream.Builder<Byte> builder = Stream.builder();
for (int i = 0; i < byteArray.length; i++) {
builder.add(byteArray[i]);
}
Stream<Byte> stream = builder.build();
stream.forEach(str -> System.out.print(str + " "));
/*for(Object b : stream.toArray()){
String a= new String(new byte[]{(byte)b});
System.out.println(a);
}*/