相关疑难解决方法(0)

以gzip格式包装缩小的数据

我想我错过了很简单的事情.我有一个字节数组,使用Deflater保存写入其中的缩小数据:

deflate(outData, 0, BLOCK_SIZE, SYNC_FLUSH)
Run Code Online (Sandbox Code Playgroud)

我不仅使用GZIPOutputStream的原因是因为有4个线程(变量),每个线程都被赋予一个数据块,每个线程在将压缩数据存储到全局字节数组之前压缩它自己的块.如果我使用GZIPOutputStream它会混淆格式,因为每个小块都有一个标题和预告片,它是自己的gzip数据(我只想压缩它).

所以最后,我得到了这个byteArray,outData,它保存了我所有的压缩数据,但我不确定如何包装它.GZIPOutputStream从具有未压缩数据的缓冲区写入,但此数组全部已设置.它已经被压缩了,我只是试图弄清楚如何将它变成一个表格.

编辑:好的,我的措辞不好.我将它写入输出,而不是文件,以便在需要时可以重定向.一个非常简单的例子是

cat file.txt | java Jzip | gzip -d | cmp file.txt
Run Code Online (Sandbox Code Playgroud)

应该返回0.现在的问题是如果我按原样编写这个字节数组来输出,它只是"原始"压缩数据.我认为gzip需要所有这些额外的信息.

如果有另一种方法,那就没问题了.这样的全部原因是因为我需要使用多个线程.否则我只会调用GZIPOutputStream.

DOUBLE EDIT:由于评论提供了很多好的见解,另一种方法是我只有一堆未压缩的数据块,这些数据块原本是一个长流.如果gzip可以读取连接流,如果我接受了这些块(并按顺序保存它们)并将每个块分配给一个在自己的块上调用GZIPOutputStream的线程,然后取结果并连接它们.实质上,每个块现在都有标题,压缩信息和预告片.如果我连接它们,gzip会认识到吗?

例:

cat file.txt
Hello world! How are you? I'm ready to set fire to this assignment.

java Testcase < file.txt > file.txt.gz
Run Code Online (Sandbox Code Playgroud)

所以我从输入中接受它.在程序内部,流被分成"Hello world!"."你好吗?" "我准备放火烧这个任务"(它们不是字符串,它只是一个字节数组!这只是插图)

所以我有三个字节块,都是未压缩的.我将每个块都给了一个使用的线程

public static class DGZIPOutputStream extends GZIPOutputStream
{
    public DGZIPOutputStream(OutputStream out, boolean flush) throws IOException
    {
        super(out, flush);
    }
    public void setDictionary(byte[] b)
    {
        def.setDictionary(b);
    }
    public void updateCRC(byte[] input)
    {
        crc.update(input); …
Run Code Online (Sandbox Code Playgroud)

java multithreading gzip concatenation deflate

1
推荐指数
1
解决办法
1452
查看次数

标签 统计

concatenation ×1

deflate ×1

gzip ×1

java ×1

multithreading ×1