Java 连接两个压缩字节数组
您好,我有一个地图减少工作,合并不同的字节数组一起基于一些分组算法 我尝试使用Javadeflater单独压缩每个数组,但当我尝试提取结果压缩字节数组时,它只是我提取的第一个子数组 字节数组一旦压缩,是否可能只是连接然后提取,或者不是这样 我想要的是:Java 连接两个压缩字节数组,java,performance,java-8,zip,gzip,Java,Performance,Java 8,Zip,Gzip,您好,我有一个地图减少工作,合并不同的字节数组一起基于一些分组算法 我尝试使用Javadeflater单独压缩每个数组,但当我尝试提取结果压缩字节数组时,它只是我提取的第一个子数组 字节数组一旦压缩,是否可能只是连接然后提取,或者不是这样 我想要的是: byte array1[] - zip byte array2[] - zip byte array3[] = append(array1,array2). unzip resulting array3. 解压时,我只收到数组1。压缩文件是结构
byte array1[] - zip
byte array2[] - zip
byte array3[] = append(array1,array2).
unzip resulting array3.
解压时,我只收到数组1。压缩文件是结构化的,它们不仅包含“压缩”数据。对于文件中的每个条目,都有一个本地头和相应的条目数据。在文件的末尾有一个中心目录,其中列出了存档中包含的所有zip条目以及这些条目开始的偏移量。您可能会认为zip文件大致如下:
[entry-header,data][entry-header,data].....[central dir with entry meta-data][end-of-file]
不能将两个zip文件作为字节数组“合并”,因为结果将不是有效的zip文件 zip文件是结构化的,它们不仅包含“压缩”数据。对于文件中的每个条目,都有一个本地头和相应的条目数据。在文件的末尾有一个中心目录,其中列出了存档中包含的所有zip条目以及这些条目开始的偏移量。您可能会认为zip文件大致如下:
[entry-header,data][entry-header,data].....[central dir with entry meta-data][end-of-file]
不能将两个zip文件作为字节数组“合并”,因为结果将不是有效的zip文件 使用简单的循环可以更有效地实现这一点,但如果决定使用Java8的
流
,他们可能会尝试类似的方法。我没有测试它,但假设有一个函数可以将一个单字节数组解压缩到另一个字节数组中:
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))
流开始
map()
将每个压缩的字节[]
转换为未压缩的字节[]
flatMapToInt()
从每个字节[]
中获取字节,并创建一个连续的基本int流字节
只是一个int
瞬间,因为在下一阶段中,它会在mapToObj()中将其转换为一个装箱的字节
列表的集合结束,该集合随后被传递到guava的Bytes.toArray()
以将其转换为一个连续的解压缩数据字节数组
使用简单的循环可以更有效地实现这一点,但如果决定使用Java8的
流
,他们可能会尝试类似的方法。我没有测试它,但假设有一个函数可以将一个单字节数组解压缩到另一个字节数组中:
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))
流开始
map()
将每个压缩的字节[]
转换为未压缩的字节[]
flatMapToInt()
从每个字节[]
中获取字节,并创建一个连续的基本int流字节
只是一个int
瞬间,因为在下一阶段中,它会在mapToObj()中将其转换为一个装箱的字节
列表的集合结束,该集合随后被传递到guava的Bytes.toArray()
以将其转换为一个连续的解压缩数据字节数组
事实并非如此。不能以
字节[]
的形式连接压缩数据。事实并非如此。您不能以字节[]
的形式连接压缩数据。我想没有其他压缩机制。问题是我正在使用Java8流式API和收集器。每次我插入累加器时,我都可能使用ZippeOutputStream进行压缩,但是当我开始组合项目时,我必须在再次压缩之前进行解压缩,以便组合这两个数组。是吗?据我所知你的问题-是的,这是正确的。您不能像f1sh已经指出的那样连接压缩的数据。我想没有替代的压缩机制。问题是我正在使用Java8流式API和收集器。每次我插入累加器时,我都可能使用ZippeOutputStream进行压缩,但是当我开始组合项目时,我必须在再次压缩之前进行解压缩,以便组合这两个数组。是吗?据我所知你的问题-是的,这是正确的。您不能像f1sh已经指出的那样连接压缩数据。