Module java.base
Package java.util.zip

Class Deflater

java.lang.Object
java.util.zip.Deflater

public class Deflater extends Object
该类提供了对使用流行的ZLIB压缩库进行通用压缩的支持。ZLIB压缩库最初作为PNG图形标准的一部分开发,并且不受专利保护。在java.util.zip包描述中完整描述了规范。

该类将字节序列压缩为ZLIB压缩数据格式。输入字节序列通过其中一个setInput()方法以字节数组或字节缓冲区的形式提供。输出字节序列写入传递给deflate()方法的输出字节数组或字节缓冲区。

以下代码片段演示了使用DeflaterInflater对字符串进行简单压缩和解压缩。

 try {
     // 将字符串编码为字节
     String inputString = "blahblahblah";
     byte[] input = inputString.getBytes("UTF-8");

     // 压缩字节
     byte[] output = new byte[100];
     Deflater compresser = new Deflater();
     compresser.setInput(input);
     compresser.finish();
     int compressedDataLength = compresser.deflate(output);
     compresser.end();

     // 解压缩字节
     Inflater decompresser = new Inflater();
     decompresser.setInput(output, 0, compressedDataLength);
     byte[] result = new byte[100];
     int resultLength = decompresser.inflate(result);
     decompresser.end();

     // 将字节解码为字符串
     String outputString = new String(result, 0, resultLength, "UTF-8");
 } catch (java.io.UnsupportedEncodingException ex) {
     // 处理
 } catch (java.util.zip.DataFormatException ex) {
     // 处理
 }
 
API 注意:
要释放此Deflater使用的资源,应显式调用end()方法。子类负责清理子类获取的资源。覆盖Object.finalize()以执行清理的子类应修改为使用替代清理机制,如Cleaner并删除覆盖的finalize方法。
自:
1.1
另请参见:
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final int
    最佳压缩的压缩级别。
    static final int
    最快压缩的压缩级别。
    static final int
    默认压缩级别。
    static final int
    默认压缩策略。
    static final int
    deflate算法的压缩方法(目前仅支持的方法)。
    static final int
    最适合由大部分小值组成且具有较随机分布的数据的压缩策略。强制执行更多的Huffman编码和更少的字符串匹配。
    static final int
    用于刷新所有挂起输出并重置压缩器的压缩刷新模式。
    static final int
    仅用于Huffman编码的压缩策略。
    static final int
    无压缩的压缩级别。
    static final int
    用于实现最佳压缩结果的压缩刷新模式。
    static final int
    用于刷新所有挂起输出的压缩刷新模式;可能会降低某些压缩算法的压缩效果。
  • Constructor Summary

    Constructors
    Constructor
    Description
    使用默认压缩级别创建新的压缩器。
    Deflater(int level)
    使用指定的压缩级别创建新的压缩器。
    Deflater(int level, boolean nowrap)
    使用指定的压缩级别创建新的压缩器。
  • Method Summary

    Modifier and Type
    Method
    Description
    int
    deflate(byte[] output)
    压缩输入数据并使用压缩数据填充指定的缓冲区。
    int
    deflate(byte[] output, int off, int len)
    压缩输入数据并使用压缩数据填充指定的缓冲区。
    int
    deflate(byte[] output, int off, int len, int flush)
    压缩输入数据并使用压缩数据填充指定的缓冲区。
    int
    deflate(ByteBuffer output)
    压缩输入数据并使用压缩数据填充指定的缓冲区。
    int
    deflate(ByteBuffer output, int flush)
    压缩输入数据并使用压缩数据填充指定的缓冲区。
    void
    end()
    关闭压缩器并丢弃任何未处理的输入。
    void
    finish()
    调用时,表示应该以输入缓冲区的当前内容结束压缩。
    boolean
    返回true,如果已到达压缩数据输出流的末尾。
    int
    返回未压缩数据的ADLER-32值。
    long
    迄今为止输入的未压缩字节数总数。
    long
    迄今为止输出的压缩字节数总数。
    int
    迄今为止输入的未压缩字节数总数。
    int
    迄今为止输出的压缩字节数总数。
    boolean
    如果输入缓冲区中没有数据剩余,则返回true。
    void
    reset()
    重置压缩器,以便可以处理新的一组输入数据。
    void
    setDictionary(byte[] dictionary)
    为压缩设置预设字典。
    void
    setDictionary(byte[] dictionary, int off, int len)
    为压缩设置预设字典。
    void
    setDictionary(ByteBuffer dictionary)
    为压缩设置预设字典。
    void
    setInput(byte[] input)
    为压缩设置输入数据。
    void
    setInput(byte[] input, int off, int len)
    为压缩设置输入数据。
    void
    为压缩设置输入数据。
    void
    setLevel(int level)
    将压缩级别设置为指定值。
    void
    setStrategy(int strategy)
    将压缩策略设置为指定值。

    Methods declared in class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • DEFLATED

      public static final int DEFLATED
      deflate算法的压缩方法(目前仅支持的方法)。
      另请参见:
    • NO_COMPRESSION

      public static final int NO_COMPRESSION
      无压缩的压缩级别。
      另请参见:
    • BEST_SPEED

      public static final int BEST_SPEED
      最快压缩的压缩级别。
      另请参见:
    • BEST_COMPRESSION

      public static final int BEST_COMPRESSION
      最佳压缩的压缩级别。
      另请参见:
    • DEFAULT_COMPRESSION

      public static final int DEFAULT_COMPRESSION
      默认压缩级别。
      另请参见:
    • FILTERED

      public static final int FILTERED
      最适合由大部分小值组成且具有较随机分布的数据的压缩策略。强制执行更多的Huffman编码和更少的字符串匹配。
      另请参见:
    • HUFFMAN_ONLY

      public static final int HUFFMAN_ONLY
      仅用于Huffman编码的压缩策略。
      另请参见:
    • DEFAULT_STRATEGY

      public static final int DEFAULT_STRATEGY
      默认压缩策略。
      另请参见:
    • NO_FLUSH

      public static final int NO_FLUSH
      用于实现最佳压缩结果的压缩刷新模式。
      自:
      1.7
      另请参见:
    • SYNC_FLUSH

      public static final int SYNC_FLUSH
      用于刷新所有挂起输出的压缩刷新模式;可能会降低某些压缩算法的压缩效果。
      自:
      1.7
      另请参见:
    • FULL_FLUSH

      public static final int FULL_FLUSH
      用于刷新所有挂起输出并重置压缩器的压缩刷新模式。过于频繁地使用此模式可能严重降低压缩效果。
      自:
      1.7
      另请参见:
  • Constructor Details

    • Deflater

      public Deflater(int level, boolean nowrap)
      使用指定的压缩级别创建新的压缩器。如果'nowrap'为true,则不会使用ZLIB头和校验和字段,以支持GZIP和PKZIP中使用的压缩格式。
      参数:
      level - 压缩级别(0-9)
      nowrap - 如果为true,则使用GZIP兼容的压缩
    • Deflater

      public Deflater(int level)
      使用指定的压缩级别创建新的压缩器。生成的压缩数据将采用ZLIB格式。
      参数:
      level - 压缩级别(0-9)
    • Deflater

      public Deflater()
      使用默认压缩级别创建新的压缩器。生成的压缩数据将采用ZLIB格式。
  • Method Details

    • setInput

      public void setInput(byte[] input, int off, int len)
      为压缩设置输入数据。

      每当needsInput()返回true指示需要更多输入数据时,应调用其中一个setInput()方法。

      参数:
      input - 输入数据字节
      off - 数据的起始偏移量
      len - 数据的长度
      另请参见:
    • setInput

      public void setInput(byte[] input)
      为压缩设置输入数据。

      每当needsInput()返回true指示需要更多输入数据时,应调用其中一个setInput()方法。

      参数:
      input - 输入数据字节
      另请参见:
    • setInput

      public void setInput(ByteBuffer input)
      设置压缩的输入数据。

      每当needsInput()返回true时,应调用setInput()方法之一,表示需要更多的输入数据。

      随着进行压缩操作,给定缓冲区的位置将会前进,直到缓冲区的限制。在进行压缩操作之间,可以修改(重新填充)输入缓冲区;这样做等同于创建一个新的缓冲区并使用此方法设置它。

      在进行压缩操作时同时修改输入缓冲区的内容、位置或限制将导致未定义的行为,可能包括操作结果不正确或操作失败。

      参数:
      input - 输入数据字节
      自版本:
      11
      参见:
    • setDictionary

      public void setDictionary(byte[] dictionary, int off, int len)
      为压缩设置预设字典。当历史缓冲区可以预先确定时,将使用预设字典。当稍后使用Inflater.inflate()解压缩数据时,可以调用Inflater.getAdler()以获取解压缩所需的字典的Adler-32值。
      参数:
      dictionary - 字典数据字节
      off - 数据的起始偏移量
      len - 数据的长度
      参见:
    • setDictionary

      public void setDictionary(byte[] dictionary)
      为压缩设置预设字典。当历史缓冲区可以预先确定时,将使用预设字典。当稍后使用Inflater.inflate()解压缩数据时,可以调用Inflater.getAdler()以获取解压缩所需的字典的Adler-32值。
      参数:
      dictionary - 字典数据字节
      参见:
    • setDictionary

      public void setDictionary(ByteBuffer dictionary)
      为压缩设置预设字典。当历史缓冲区可以预先确定时,将使用预设字典。当稍后使用Inflater.inflate()解压缩数据时,可以调用Inflater.getAdler()以获取解压缩所需的字典的Adler-32值。

      给定的字节缓冲区中的字节将被此方法完全消耗。返回时,其位置将等于其限制。

      参数:
      dictionary - 字典数据字节
      参见:
    • setStrategy

      public void setStrategy(int strategy)
      将压缩策略设置为指定的值。

      如果更改了压缩策略,则下一次调用deflate将使用旧策略压缩到目前为止可用的输入(并可能被刷新);新策略将仅在该调用之后生效。

      参数:
      strategy - 新的压缩策略
      抛出:
      IllegalArgumentException - 如果压缩策略无效
    • setLevel

      public void setLevel(int level)
      将压缩级别设置为指定的值。

      如果更改了压缩级别,则下一次调用deflate将使用旧级别压缩到目前为止可用的输入(并可能被刷新);新级别将仅在该调用之后生效。

      参数:
      level - 新的压缩级别(0-9)
      抛出:
      IllegalArgumentException - 如果压缩级别无效
    • needsInput

      public boolean needsInput()
      如果输入缓冲区中没有剩余数据,则返回true。这可用于确定是否应调用setInput()方法以提供更多输入。
      返回:
      如果输入数据缓冲区为空且应调用setInput()以提供更多输入,则返回true
    • finish

      public void finish()
      调用时,表示应以输入缓冲区的当前内容结束压缩。
    • finished

      public boolean finished()
      如果已到达压缩数据输出流的末尾,则返回true。
      返回:
      如果已到达压缩数据输出流的末尾,则返回true
    • deflate

      public int deflate(byte[] output, int off, int len)
      压缩输入数据并使用压缩数据填充指定的缓冲区。返回压缩数据的实际字节数。返回值为0表示应调用needsInput以确定是否需要更多输入数据。

      此方法使用NO_FLUSH作为其压缩刷新模式。调用此方法的形式deflater.deflate(b, off, len)的结果与调用deflater.deflate(b, off, len, Deflater.NO_FLUSH)的结果相同。

      参数:
      output - 用于压缩数据的缓冲区
      off - 数据的起始偏移量
      len - 压缩数据的最大字节数
      返回:
      写入输出缓冲区的压缩数据的实际字节数
    • deflate

      public int deflate(byte[] output)
      压缩输入数据并使用压缩数据填充指定的缓冲区。返回压缩数据的实际字节数。返回值为0表示应调用needsInput以确定是否需要更多输入数据。

      此方法使用NO_FLUSH作为其压缩刷新模式。调用此方法的形式deflater.deflate(b)的结果与调用deflater.deflate(b, 0, b.length, Deflater.NO_FLUSH)的结果相同。

      参数:
      output - 用于压缩数据的缓冲区
      返回:
      写入输出缓冲区的压缩数据的实际字节数
    • deflate

      public int deflate(ByteBuffer output)
      压缩输入数据并使用压缩数据填充指定的缓冲区。返回压缩数据的实际字节数。返回值为0表示应调用needsInput以确定是否需要更多输入数据。

      此方法使用NO_FLUSH作为其压缩刷新模式。调用此方法的形式deflater.deflate(output)的结果与调用deflater.deflate(output, Deflater.NO_FLUSH)的结果相同。

      参数:
      output - 用于压缩数据的缓冲区
      返回:
      写入输出缓冲区的压缩数据的实际字节数
      抛出:
      ReadOnlyBufferException - 如果给定的输出缓冲区是只读的
      自版本:
      11
    • deflate

      public int deflate(byte[] output, int off, int len, int flush)
      压缩输入数据并使用压缩数据填充指定的缓冲区。返回压缩数据的实际字节数。

      压缩刷新模式有以下三种模式:

      • NO_FLUSH:允许压缩器决定累积多少数据后才产生输出,以实现最佳压缩(应在正常使用场景中使用)。在此刷新模式下,返回值为0表示应调用needsInput()以确定是否需要更多输入数据。
      • SYNC_FLUSH:刷新压缩器中的所有挂起输出到指定的输出缓冲区,以便对压缩数据进行操作的解压缩器可以获取到目前为止所有可用的输入数据(特别是在提供足够输出空间后,needsInput()返回true)。使用SYNC_FLUSH可能会降低某些压缩算法的压缩效果,因此仅在必要时使用。
      • FULL_FLUSH:将所有挂起输出刷新,与SYNC_FLUSH相同。重置压缩状态,以便对压缩输出数据进行操作的解压缩器可以从此点重新开始,如果之前的压缩数据已损坏或需要随机访问。过于频繁地使用FULL_FLUSH可能会严重降低压缩效果。

      FULL_FLUSHSYNC_FLUSH的情况下,如果返回值为len,即输出缓冲区中的可用空间,应再次使用相同的flush参数调用此方法,并提供更多的输出空间。确保len大于6,以避免在每次调用此方法时重复输出刷新标记(5字节)到输出缓冲区。

      如果调用setInput(ByteBuffer)方法以提供输入缓冲区,则输入缓冲区的位置将会随着此操作消耗的字节数而前进。

      参数:
      output - 用于压缩数据的缓冲区
      off - 数据的起始偏移量
      len - 压缩数据的最大字节数
      flush - 压缩刷新模式
      返回:
      写入输出缓冲区的压缩数据的实际字节数
      抛出:
      IllegalArgumentException - 如果刷新模式无效
      自版本:
      1.7
    • deflate

      public int deflate(ByteBuffer output, int flush)
      压缩输入数据,并使用压缩数据填充指定的缓冲区。返回实际压缩的数据字节数。

      压缩刷新模式是以下三种模式之一:

      • NO_FLUSH:允许压缩器决定在产生输出之前累积多少数据,以实现最佳压缩(应在正常使用场景中使用)。在此刷新模式下返回值为0表示应调用needsInput()以确定是否需要更多输入数据。
      • SYNC_FLUSH:刷新压缩器中的所有挂起输出到指定的输出缓冲区,以便处理压缩数据的解压器可以获取到目前为止所有可用的输入数据(特别是在此调用后,如果提供足够的输出空间,needsInput()将返回true)。使用SYNC_FLUSH可能会降低某些压缩算法的压缩效果,因此仅在必要时使用。
      • FULL_FLUSH:所有挂起的输出都会像SYNC_FLUSH一样被刷新。压缩状态将被重置,以便处理压缩输出数据的解压器可以从此点重新开始,如果之前的压缩数据已损坏或需要随机访问。过于频繁地使用FULL_FLUSH可能会严重降低压缩效果。

      FULL_FLUSHSYNC_FLUSH的情况下,如果返回值等于缓冲区的剩余空间,则应再次使用相同的flush参数调用此方法,并提供更多的输出空间。确保缓冲区至少有6个字节的剩余空间,以避免在每次调用此方法时重复输出刷新标记(5个字节)到输出缓冲区。

      成功时,给定output字节缓冲区的位置将向前移动与此操作生成的字节数相同,即与此方法返回的数字相同。

      如果调用了setInput(ByteBuffer)方法以提供输入缓冲区,则输入缓冲区的位置将向前移动此操作消耗的字节数。

      参数:
      output - 用于压缩数据的缓冲区
      flush - 压缩刷新模式
      返回:
      写入输出缓冲区的实际压缩数据字节数
      抛出:
      IllegalArgumentException - 如果刷新模式无效
      ReadOnlyBufferException - 如果给定的输出缓冲区是只读的
      自:
      11
    • getAdler

      public int getAdler()
      返回未压缩数据的ADLER-32值。
      返回:
      未压缩数据的ADLER-32值
    • getTotalIn

      public int getTotalIn()
      返回到目前为止输入的总未压缩字节数。

      由于字节数可能大于Integer.MAX_VALUE,现在getBytesRead()方法是获取此信息的首选方法。

      返回:
      到目前为止输入的总未压缩字节数
    • getBytesRead

      public long getBytesRead()
      返回到目前为止输入的总未压缩字节数。
      返回:
      到目前为止输入的总(非负)未压缩字节数
      自:
      1.5
    • getTotalOut

      public int getTotalOut()
      返回到目前为止输出的总压缩字节数。

      由于字节数可能大于Integer.MAX_VALUE,现在getBytesWritten()方法是获取此信息的首选方法。

      返回:
      到目前为止输出的总压缩字节数
    • getBytesWritten

      public long getBytesWritten()
      返回到目前为止输出的总压缩字节数。
      返回:
      到目前为止输出的总(非负)压缩字节数
      自:
      1.5
    • reset

      public void reset()
      重置压缩器,以便处理新的输入数据。保留当前的压缩级别和策略设置。
    • end

      public void end()
      关闭压缩器并丢弃任何未处理的输入。当不再使用压缩器时应调用此方法。一旦调用此方法,Deflater对象的行为将变得不确定。