模块 java.base

类 Deflater

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

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

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

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

 try {
   // Encode a String into bytes
   String inputString = "blahblahblah";
   byte[] input = inputString.getBytes("UTF-8");

   // Compress the bytes
   byte[] output = new byte[100];
   Deflater compresser = new Deflater();
   compresser.setInput(input);
   compresser.finish();
   int compressedDataLength = compresser.deflate(output);
   compresser.end();

   // Decompress the bytes
   Inflater decompresser = new Inflater();
   decompresser.setInput(output, 0, compressedDataLength);
   byte[] result = new byte[100];
   int resultLength = decompresser.inflate(result);
   decompresser.end();

   // Decode the bytes into a String
   String outputString = new String(result, 0, resultLength, "UTF-8");
 } catch (java.io.UnsupportedEncodingException ex) {
   // handle
 } catch (java.util.zip.DataFormatException ex) {
   // handle
 }
 
API 注意:
要释放此 Deflater 使用的资源,应显式调用 end() 方法。子类负责清理子类获取的资源。重写 Object.finalize() 以执行清理的子类应修改为使用替代清理机制,例如 Cleaner 并删除重写的 finalize 方法。
自从:
1.1
参见:
  • 字段摘要

    字段
    修饰符和类型
    Field
    描述
    static final int
    最佳压缩的压缩级别。
    static final int
    最快压缩的压缩级别。
    static final int
    默认压缩级别。
    static final int
    默认压缩策略。
    static final int
    deflate算法的压缩方式(目前唯一支持)。
    static final int
    压缩策略最适用于主要由具有某种随机分布的小值组成的数据。
    static final int
    Compression flush 模式用于清除所有待处理的输出并重置 deflater。
    static final int
    仅用于霍夫曼编码的压缩策略。
    static final int
    无压缩的压缩级别。
    static final int
    压缩刷新模式用于实现最佳压缩结果。
    static final int
    Compression flush mode 用于清除所有待处理的输出;可能会降低某些压缩算法的压缩率。
  • 构造方法总结

    构造方法
    构造方法
    描述
    创建具有默认压缩级别的新压缩器。
    Deflater(int level)
    使用指定的压缩级别创建一个新的压缩器。
    Deflater(int level, boolean nowrap)
    使用指定的压缩级别创建一个新的压缩器。
  • 方法总结

    修饰符和类型
    方法
    描述
    int
    deflate(byte[] output)
    压缩输入数据并用压缩数据填充指定的缓冲区。
    int
    deflate(byte[] output, int off, int len)
    压缩输入数据并用压缩数据填充指定的缓冲区。
    int
    deflate(byte[] output, int off, int len, int flush)
    压缩输入数据并用压缩数据填充指定的缓冲区。
    int
    压缩输入数据并用压缩数据填充指定的缓冲区。
    int
    deflate(ByteBuffer output, int flush)
    压缩输入数据并用压缩数据填充指定的缓冲区。
    void
    end()
    关闭压缩器并丢弃任何未处理的输入。
    void
    调用时,指示压缩应以输入缓冲区的当前内容结束。
    boolean
    如果已到达压缩数据输出流的末尾,则返回 true。
    int
    返回未压缩数据的 ADLER-32 值。
    long
    返回到目前为止输入的未压缩字节总数。
    long
    返回到目前为止输出的压缩字节总数。
    int
    返回到目前为止输入的未压缩字节总数。
    int
    返回到目前为止输出的压缩字节总数。
    boolean
    如果输入缓冲区中没有数据,则返回 true。
    void
    重置放气器以便可以处理一组新的输入数据。
    void
    setDictionary(byte[] dictionary)
    设置压缩的预设字典。
    void
    setDictionary(byte[] dictionary, int off, int len)
    设置压缩的预设字典。
    void
    设置压缩的预设字典。
    void
    setInput(byte[] input)
    设置要压缩的输入数据。
    void
    setInput(byte[] input, int off, int len)
    设置要压缩的输入数据。
    void
    设置要压缩的输入数据。
    void
    setLevel(int level)
    将压缩级别设置为指定值。
    void
    setStrategy(int strategy)
    将压缩策略设置为指定值。

    在类 java.lang.Object 中声明的方法

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 字段详细信息

    • 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_ONLY

      public static final int HUFFMAN_ONLY
      仅用于霍夫曼编码的压缩策略。
      参见:
    • 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
      Compression flush mode 用于清除所有待处理的输出;可能会降低某些压缩算法的压缩率。
      自从:
      1.7
      参见:
    • FULL_FLUSH

      public static final int FULL_FLUSH
      Compression flush 模式用于清除所有待处理的输出并重置 deflater。过于频繁地使用此模式会严重降低压缩率。
      自从:
      1.7
      参见:
  • 构造方法详细信息

    • Deflater

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

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

      public Deflater()
      创建具有默认压缩级别的新压缩器。压缩数据将以 ZLIB 格式生成。
  • 方法详情

    • 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() 以提供更多输入,则为真
    • finish

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

      public boolean finished()
      如果已到达压缩数据输出流的末尾,则返回 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 :deflater 中的所有未决输出都被刷新到指定的输出缓冲区,以便处理压缩数据的 inflater 可以获得目前可用的所有输入数据(特别是如果提供了足够的输出空间,则 needsInput() 在此调用后返回 true ).使用 SYNC_FLUSH 刷新可能会降低某些压缩算法的压缩率,因此只应在必要时使用。
      • FULL_FLUSH :与 SYNC_FLUSH 一样,所有未决输出都被清除。如果先前的压缩数据已损坏或需要随机访问,压缩状态将被重置,以便在压缩输出数据上工作的 inflater 可以从这一点重新启动。经常使用 FULL_FLUSH 会严重降低压缩率。

      FULL_FLUSH SYNC_FLUSH 的情况下,如果返回值为 len ,即输出缓冲区 b 中的可用空间,则应使用相同的 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 :deflater 中的所有未决输出都被刷新到指定的输出缓冲区,以便处理压缩数据的 inflater 可以获得目前可用的所有输入数据(特别是如果提供了足够的输出空间,则 needsInput() 在此调用后返回 true ).使用 SYNC_FLUSH 刷新可能会降低某些压缩算法的压缩率,因此只应在必要时使用。
      • FULL_FLUSH :与 SYNC_FLUSH 一样,所有未决输出都被清除。如果先前的压缩数据已损坏或需要随机访问,压缩状态将被重置,以便在压缩输出数据上工作的 inflater 可以从这一点重新启动。经常使用 FULL_FLUSH 会严重降低压缩率。

      FULL_FLUSH SYNC_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 对象的行为是不确定的。