模块  java.base
软件包  java.util.zip

Class Deflater


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

    该类将字节序列压缩为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 Note:
    要释放此Deflater使用的资源,应显式调用end()方法。 子类负责清理子类获取的资源。 应修改覆盖finalize()以执行清理的子类,以使用替代清理机制(如Cleaner并删除重写的finalize方法。
    实现要求:
    如果这个Deflater已经子类和end方法已被重写,该end方法将由最后定稿时调用的时候deflater不可达。 但是子类不应该依赖于这个具体的实现; 最终确定不可靠,并且不推荐使用finalize方法。
    从以下版本开始:
    1.1
    另请参见:
    Inflater
    • 字段汇总

      字段  
      变量和类型 字段 描述
      static int BEST_COMPRESSION
      最佳压缩的压缩级别。
      static int BEST_SPEED
      压缩级别可实现最快压缩。
      static int DEFAULT_COMPRESSION
      默认压缩级别。
      static int DEFAULT_STRATEGY
      默认压缩策略。
      static int DEFLATED
      deflate算法的压缩方法(目前唯一支持的算法)。
      static int FILTERED
      压缩策略最适用于主要由小值组成的数据,这些值具有一定程度的随机分布。
      static int FULL_FLUSH
      压缩刷新模式用于清除所有挂起的输出并重置deflater。
      static int HUFFMAN_ONLY
      仅用于霍夫曼编码的压缩策略。
      static int NO_COMPRESSION
      无压缩的压缩级别。
      static int NO_FLUSH
      压缩冲洗模式用于实现最佳压缩效果。
      static int SYNC_FLUSH
      压缩刷新模式用于清除所有挂起的输出; 可能会降低某些压缩算法的压缩率。
    • 构造方法摘要

      构造方法  
      构造器 描述
      Deflater()
      使用默认压缩级别创建新压缩器。
      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 deflate​(ByteBuffer output)
      压缩输入数据并使用压缩数据填充指定的缓冲区。
      int deflate​(ByteBuffer output, int flush)
      压缩输入数据并使用压缩数据填充指定的缓冲区。
      void end()
      关闭压缩器并丢弃任何未处理的输入。
      protected void finalize()
      不推荐使用,要删除:此API元素将在以后的版本中删除。
      finalize方法已被弃用,将被删除。
      void finish()
      调用时,表示压缩应以输入缓冲区的当前内容结束。
      boolean finished()
      如果已到达压缩数据输出流的末尾,则返回true。
      int getAdler()
      返回未压缩数据的ADLER-32值。
      long getBytesRead()
      返回到目前为止输入的未压缩字节总数。
      long getBytesWritten()
      返回到目前为止输出的压缩字节总数。
      int getTotalIn()
      返回到目前为止输入的未压缩字节总数。
      int getTotalOut()
      返回到目前为止输出的压缩字节总数。
      boolean needsInput()
      如果输入缓冲区中没有数据,则返回true。
      void reset()
      重置deflater,以便处理一组新的输入数据。
      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 setInput​(ByteBuffer input)
      设置压缩的输入数据。
      void setLevel​(int level)
      将压缩级别设置为指定的值。
      void setStrategy​(int strategy)
      将压缩策略设置为指定值。
    • 字段详细信息

      • 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
        默认压缩策略。
        另请参见:
        常数字段值
      • SYNC_FLUSH

        public static final int SYNC_FLUSH
        压缩刷新模式用于清除所有挂起的输出; 可能会降低某些压缩算法的压缩率。
        从以下版本开始:
        1.7
        另请参见:
        deflate(byte[], int, int, int)常数字段值
      • FULL_FLUSH

        public static final int FULL_FLUSH
        压缩刷新模式用于清除所有挂起的输出并重置deflater。 过于频繁地使用此模式会严重降低压缩性能。
        从以下版本开始:
        1.7
        另请参见:
        deflate(byte[], int, int, int)常数字段值
    • 构造方法详细信息

      • Deflater

        public Deflater​(int level,
                        boolean nowrap)
        使用指定的压缩级别创建新的压缩器。 如果'nowrap'为真,那么将不使用ZLIB头和校验和字段以支持GZIP和PKZIP中使用的压缩格式。
        参数
        level - 压缩级别(0-9)
        nowrap - 如果为true,则使用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 - 数据的长度
        另请参见:
        needsInput()
      • setInput

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

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

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

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

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

        当执行deflate操作时,给定缓冲区的位置将被提前,直到缓冲区的限制。 可以在放气操作之间修改(重新填充)输入缓冲器; 这样做相当于创建一个新缓冲区并使用此方法进行设置。

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

        参数
        input - 输入数据字节
        从以下版本开始:
        11
        另请参见:
        needsInput()
      • setDictionary

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

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

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

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

        参数
        dictionary - 字典数据字节
        另请参见:
        Inflater.inflate(byte[], int, int)Inflater.getAdler()
      • 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.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)产生与调用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.deflate(output, Deflater.NO_FLUSH)相同的结果。

        参数
        output - 压缩数据的缓冲区
        结果
        写入输出缓冲区的压缩数据的实际字节数
        从以下版本开始:
        11
      • deflate

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

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

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

        对于FULL_FLUSHSYNC_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 :允许deflater在产生输出之前决定累积多少数据,以实现最佳压缩(应在正常使用场景中使用)。 此刷新模式下的返回值0表示应调用needsInput()以确定是否需要更多输入数据。
        • SYNC_FLUSH :将deflater中的所有挂起输出刷新到指定的输出缓冲区,以便处理压缩数据的inflater可以获得到目前为止所有可用的输入数据(特别是如果提供了足够的输出空间, true在此调用后返回true )。 使用SYNC_FLUSH进行刷新可能会降低某些压缩算法的压缩率,因此只应在必要时使用。
        • FULL_FLUSH :所有挂起的输出都与SYNC_FLUSH一样被刷新。 重置压缩状态,以便如果先前的压缩数据已损坏或需要随机访问,则对压缩输出数据起作用的inflater可以从此点重新启动。 经常使用FULL_FLUSH会严重降低压缩性能。

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

        成功时,给定的output字节缓冲区的位置将提前操作产生的字节数,该字节数等于此方法返回的数字。

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

        参数
        output - 压缩数据的缓冲区
        flush - 压缩刷新模式
        结果
        写入输出缓冲区的压缩数据的实际字节数
        异常
        IllegalArgumentException - 如果刷新模式无效
        从以下版本开始:
        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()
        重置deflater,以便处理一组新的输入数据。 保持当前的压缩级别和策略设置。
      • end

        public void end()
        关闭压缩器并丢弃任何未处理的输入。 当压缩机不再使用时,应调用此方法。 调用此方法后,Deflater对象的行为未定义。
      • finalize

        @Deprecated(since="9",
                    forRemoval=true)
        protected void finalize()
        Deprecated, for removal: This API element is subject to removal in a future version.
        The finalize method has been deprecated and will be removed. It is implemented as a no-op. Subclasses that override finalize in order to perform cleanup should be modified to use alternative cleanup mechanisms and to remove the overriding finalize method. The recommended cleanup for compressor is to explicitly call end method when it is no longer in use. If the end is not invoked explicitly the resource of the compressor will be released when the instance becomes unreachable.
        收集垃圾时关闭压缩机。
        重写:
        finalizeObject
        另请参见:
        WeakReference, PhantomReference