你好我有一个map reduce工作,根据一些分组算法将不同的字节数组合在一起。
我尝试使用Java Deflater单独压缩每个数组,但是当我尝试提取生成的压缩字节数组时,它只是我提取的第一个子数组。
是否可能将压缩后的字节数组连接起来然后提取,或者情况并非如此?
我想要的是:
byte array1[] - zip
byte array2[] - zip
byte array3[] = append(array1,array2).
unzip resulting array3.
当我解压缩它时,我只收到数组1。
答案 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))
Stream<byte[]>
开头,包含压缩数据map()
将每个压缩的byte[]
转换为未压缩的byte[]
flatMapToInt()
从每个byte[]
获取字节并创建一个连续的原始整数流byte
只是int
,只是在下一阶段,它会将其转换为Byte
mapToObj()
。
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。