连接两个压缩的字节数组

时间:2016-04-13 13:27:14

标签: java performance java-8 zip gzip

你好我有一个map reduce工作,根据一些分组算法​​将不同的字节数组合在一起。

我尝试使用Java Deflater单独压缩每个数组,但是当我尝试提取生成的压缩字节数组时,它只是我提取的第一个子数组。

是否可能将压缩后的字节数组连接起来然后提取,或者情况并非如此?

我想要的是:

byte array1[] - zip
byte array2[] - zip
byte array3[] = append(array1,array2).
unzip resulting array3.

当我解压缩它时,我只收到数组1。

2 个答案:

答案 0 :(得分:3)

这可以通过简单循环更有效地完成,但如果确定使用java 8的Stream,他们可能会尝试这样的事情。我没有测试它,但假设有一个函数将单个字节数组解压缩到另一个字节数组:

byte[] combined = Stream.of(array1, array2, array3) // or use Stream.builder
    .map(arr -> decompress(arr))
    .flatMapToInt(a -> IntStream.range(0,a.length).map(i -> a[i]))
    .mapToObj(i -> (byte) i)                        // boxes into a Byte
    .collect(Collectors.collectingAndThen(Collectors.toList(), Bytes::toArray))
  1. 管道以Stream<byte[]>开头,包含压缩数据
  2. map()将每个压缩的byte[]转换为未压缩的byte[]
  3. flatMapToInt()从每个byte[]获取字节并创建一个连续的原始整数流
  4. 每个byte只是int,只是在下一阶段,它会将其转换为Byte
  5. 中的mapToObj()
  6. 流以List<Byte>的集合结束,然后传递给guava的Bytes.toArray(),将其转换为一个连续的解压缩数据字节数组。

答案 1 :(得分:1)

zip文件是结构化的,它们不仅包含&#34; zipped&#34;数据。对于文件中的每个条目,都有一个本地标题和相应的条目数据。在文件的末尾有一个中央目录,它列举了存档中包含的所有zip条目以及这些条目开始的偏移量。您可能会想到一个大致相同的zip文件:

[entry-header,data][entry-header,data].....[central dir with entry meta-data][end-of-file]

你不能只是&#34;合并&#34;两个zip文件作为字节数组,因为结果不是有效的zip。