如何使用Java DeflaterOutputStream

如何使用Java DeflaterOutputStream,java,gzip,Java,Gzip,编辑:我真的只需要知道Deflater派生类何时决定编写页眉和页脚数据,以及如何利用这些事实。我真的想做以下几点: 为Deflater派生类的字典加上一些字节(我想我得到了这个) 发送一些要压缩的数据到Deflater派生类(我想我得到了这个) 将所有压缩数据(没有页眉或页脚数据)输出到我想要的任何地方(不知道如何做,也可以同时使用页眉/页脚,或者只有一个,只要它是一致的) 通过再次从1开始重用对象 原始问题:我正在使用Java DeflaterOutputStream压缩一些数据。我还通过修改

编辑:我真的只需要知道Deflater派生类何时决定编写页眉和页脚数据,以及如何利用这些事实。我真的想做以下几点:

  • 为Deflater派生类的字典加上一些字节(我想我得到了这个)

  • 发送一些要压缩的数据到Deflater派生类(我想我得到了这个)

  • 将所有压缩数据(没有页眉或页脚数据)输出到我想要的任何地方(不知道如何做,也可以同时使用页眉/页脚,或者只有一个,只要它是一致的)

  • 通过再次从1开始重用对象

  • 原始问题:我正在使用Java DeflaterOutputStream压缩一些数据。我还通过修改页眉和页脚来修改压缩数据。我想给DeflaterOutputStream一些输入,让它只输出压缩数据部分,而不是gzip格式的页眉或页脚。我该怎么做

    到目前为止,我一直在尝试这样做:

    internalWriter.write(storage, 0, amountRead);
    internalWriter.finish();
    internalWriter.getDef().reset();
    
    internalWriter是DeflaterOutputStream的扩展。这将输出带有页眉和页脚的压缩数据。但是,在对同一对象进行后续调用时,它会输出压缩数据和页脚。我基本上只希望压缩数据,或者每次都发生相同的事情。有什么想法吗?关于压缩流如何使用close、flush和finish的快速解释也可能对我有所帮助,重点是页眉和页脚是何时创建和输出的


    每次我使用DeflaterOutputStream时,我希望它立即输出所有内容。这就是为什么我在上面看到的右键之后完成了这项任务…

    您可以在

    ---编辑---

    让我多帮点忙。埃利奥特·拉斯蒂·哈罗德的书也许是我找到的最好的参考书。你可以从奥莱利的书上得到。我将为你提供一些书中的引用和例子

    平减数据 Deflater类包含压缩数据块的方法。你 可以选择压缩格式、压缩级别和 压缩策略。使用Deflater类对数据进行放气需要 九个步骤:

  • 构造一个Deflater对象
  • 选择策略(可选)
  • 设置压缩级别(可选)
  • 预设字典(可选)
  • 设置输入
  • 重复放气数据,直到needsInput()返回true
  • 如果有更多输入可用,请返回步骤5以提供其他输入数据。否则,转至步骤8
  • 完成数据
  • 如果有更多的气流需要放气,则重置放气阀
  • 通常情况下,您不会直接使用这个类。相反,你 通过其中一个压缩流间接使用Deflater对象 类,如DeflaterInputStream或DeflaterOutputStream。这些 类为用户提供了更方便的程序员接口 面向流的压缩比原始Deflater方法更有效

    膨胀数据
  • 构造一个充气器对象
  • 使用要充气的压缩数据设置输入
  • 调用needsDictionary()以确定是否需要预设字典
  • 如果needsDictionary()返回true,则调用getAdler()获取字典的Adler-32校验和。然后调用setDictionary()以 设置字典数据
  • 重复充气数据,直到充气()返回0
  • 如果needsInput()返回true,请返回步骤2以提供额外的输入数据
  • finished()方法返回true

  • 现在,这本书专门用了一整章来压缩和解压数据,我认为不可能在这里全部解释。您必须完成任务的一部分,如果需要,请回答一个更窄的问题。

    听起来您需要两个流,一个是目标流,另一个是装饰目标流的压缩流。然后将未压缩的数据写入基本流,将压缩的数据写入装饰器流。换衣服前一定要冲洗干净。读取将是一个类似的过程,但您需要知道压缩数据在流中的开始和结束位置

    假设目标流是一个文件,类似于下面的伪代码

        FileOutputStream dest = new FileOutputStream(foo);
        DeflaterOutputStream decorator = new DeflaterOutputStream(dest);
    
        byte[] header = getHeader();
        byte[] body = getBody();
        byte[] footer = getFooter();
    
        dest.write(header);
        dest.flush();
        decorator.write(body);
        decorator.flush();
        dest.write(footer);
    

    我想知道你是否真的想要
    DeflaterOutputStream
    。这不是zip文件的一部分吗?如果您正在做一些定制的事情,那么您似乎只想gzip它。

    请参阅(原文如此)文档。如果
    nowrap
    为真,则不会生成头文件或尾文件,只会生成原始压缩数据。

    @jsjwooo您的问题太广泛,无法回答。尽管如此,我还是扩展了我的答案,为您提供了更多信息,并向您推荐了一份非常好的参考资料,您可以从中找到如何一劳永逸地解决这个问题。祝你好运好的,考虑我的问题如下:当一个Deffer-Ex派生类输出一个标题和/或页脚来选择数据压缩格式。根据GZIP文件格式的定义,任何压缩输出都有一个页眉/页脚。我想处理这些问题。页眉/页脚不是我要添加的东西,它们是以后解压缩文件所必需的。GZIP实际上没有太多的格式。如果想要与gzip兼容的文件,那么只需使用GZIPOutputStream.Hrmm,好吧,问题是我确实认为有一种格式:我必须利用它来完成我目前正在做的工作。伙计,非常感谢!在API中没有捕捉到这一点!现在要了解标准gzip的默认压缩级别是什么。。。