创建一个从byte []到原始字节流的流

时间:2019-11-23 02:01:43

标签: java

我有一个byte[],我想创建一个字节流。

对于int[]longdouble,我在Arrays类中看到了一些方法:

Arrays.stream(int[] array)
Arrays.stream(long[] array)
Arrays.stream(double[] array)

但是,方法Arrays.stream(byte[] array)没有任何显示。

那么将字节基元流作为实际字节获取的最简单,最简洁的方法是什么?

我需要对byte []进行转换,并且需要使用所有Stream函数来进行字节流转换(不,我不想将它们全部转换为int。)

谁有一个好的解决方案?

PS。有人从微控制器API向我提供了byte [] ...因此,如果不需要,我不想使用其他数据类型。

谢谢。

3 个答案:

答案 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);
    }*/