代码之家  ›  专栏  ›  技术社区  ›  Martin Frank

将对象[]从流转换为字节[]

  •  4
  • Martin Frank  · 技术社区  · 6 年前

    我试着过滤 byte[] ,我要从流中删除换行符

    byte[] data = "y\neahbabydoit\nsothisistheway\ntodoit".getBytes();
    Object[] tmp = IntStream.range(0, data.length).mapToObj(idx -> Integer.valueOf(data[idx]).byteValue()).filter(i -> i != 10).toArray();
    System.out.println("src:"+Arrays.toString(data));
    System.out.println("dst:"+Arrays.toString(tmp));
    
    //works not!!
    byte[] dest = (Byte[]) tmp; //help me here
    

    结果(如预期)有效(到目前为止),但我无法转换结果( Object[] )以一种简单的方式 字节[] )…

    src:[121,10,101,97,104,98,……
    夏令时:[121,101,97,104,98,97,…

    我知道有办法解决这个问题。 How to convert int[] to byte[] )但我想用一种简单的方式来做…

    有来自Java8或更高版本的消息吗?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Patrick Parker    6 年前

    正如@mureinik所建议的,最好是处理字符而不是字节,为了回答您的问题,您当然可以使用

    Byte[] tmp = IntStream.range(0, data.length)
            .mapToObj(idx -> Integer.valueOf(data[idx]).byteValue())
            .filter(i -> i != 10)
            .toArray(Byte[]::new);
    
        2
  •  2
  •   Mureinik    6 年前

    为了省去处理多字节字符的麻烦,只处理字符流可能要容易得多:

    String result =
        data.chars()
            .filter(c -> c != '\n')
            .mapToObj(c -> String.valueOf((char) c))
            .collect(Collectors.joining());
    
        3
  •  2
  •   davidxxx    6 年前

    在java 8中,收集到字节数组并不直接。
    但是通过使用 ByteArrayOutputStream::new 作为代收业务的供应商,你可以。
    这是一个有点冗长,因为检查的异常处理在身体lambda由于组合器,但它也有一些优点:它不执行任何拳击 byte Byte 它不会产生不必要的变量。

    byte[] data = "y\neahbabydoit\nsothisistheway\ntodoit".getBytes();
    byte[] dest = IntStream.range(0, data.length)
                           .map(i -> data[i])
                           .filter(i -> i != 10)
                           .collect(ByteArrayOutputStream::new, ByteArrayOutputStream::write, (bos1, bos2) -> {
                               try {
                                   bos2.writeTo(bos1);
                               } catch (IOException e) {
                                  throw new RuntimeException(e);
                               }
                           })
                           .toByteArray();
    
    System.out.println("src:" + Arrays.toString(data));
    System.out.println("dst:" + Arrays.toString(dest));
    

    输出:

    src:[121,10,101,97,104,98,97,98,121,…]

    夏令时:[121,101,97,104,98,97,98,121,…]