Module  java.base
软件包  java.util.zip

Class Deflater



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

    以下代码片段使用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
     }
     
    从以下版本开始:
    1.1
    另请参见:
    Inflater
    • Field Summary

      Fields  
      Modifier and Type Field 描述
      static int BEST_COMPRESSION
      最佳压缩压缩级别。
      static int BEST_SPEED
      压缩级别最快的压缩。
      static int DEFAULT_COMPRESSION
      默认压缩级别。
      static int DEFAULT_STRATEGY
      默认压缩策略。
      static int DEFLATED
      减压算法的压缩方法(目前唯一支持的)。
      static int FILTERED
      压缩策略最适用于主要由具有随机分布的小值组成的数据。
      static int FULL_FLUSH
      压缩冲洗模式用于清除所有待处理输出并重置放气器。
      static int HUFFMAN_ONLY
      仅用于霍夫曼编码的压缩策略。
      static int NO_COMPRESSION
      压缩等级为无压缩。
      static int NO_FLUSH
      压缩冲洗模式用于实现最佳压缩效果。
      static int SYNC_FLUSH
      压缩冲洗模式用于清除所有挂起的输出; 可能会降低某些压缩算法的压缩率。
    • 构造方法摘要

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

      所有方法  接口方法  具体的方法  弃用的方法 
      Modifier and Type 方法 描述
      int deflate​(byte[] b)
      压缩输入数据,并用压缩数据填充指定的缓冲区。
      int deflate​(byte[] b, int off, int len)
      压缩输入数据,并用压缩数据填充指定的缓冲区。
      int deflate​(byte[] b, int off, int len, int flush)
      压缩输入数据,并用压缩数据填充指定的缓冲区。
      void end​()
      关闭压缩器并丢弃任何未处理的输入。
      protected void finalize​()
      已过时。
      finalize方法已被弃用。 为了执行清理,覆盖finalize子类应被修改为使用替代清理机制,并删除覆盖finalize方法。 当覆盖finalize方法时,其实现必须明确确保按照super.finalize()中所述调用super.finalize() 有关迁移选项的更多信息,请参阅Object.finalize()的规范。
      void finish​()
      当被调用时,表示压缩应以输入缓冲区的当前内容结束。
      boolean finished​()
      如果达到压缩数据输出流的结尾,则返回true。
      int getAdler​()
      返回未压缩数据的ADLER-32值。
      long getBytesRead​()
      返回到目前为止输入的未压缩字节的总数。
      long getBytesWritten​()
      返回到目前为止输出的压缩字节总数。
      int getTotalIn​()
      返回到目前为止输入的未压缩字节的总数。
      int getTotalOut​()
      返回到目前为止输出的压缩字节总数。
      boolean needsInput​()
      如果输入数据缓冲区为空,则返回true,并调用setInput()以提供更多的输入。
      void reset​()
      重置deflater,以便可以处理一组新的输入数据。
      void setDictionary​(byte[] b)
      设置压缩预设字典。
      void setDictionary​(byte[] b, int off, int len)
      设置压缩预设字典。
      void setInput​(byte[] b)
      设置压缩输入数据。
      void setInput​(byte[] b, int off, int len)
      设置压缩输入数据。
      void setLevel​(int level)
      将压缩级别设置为指定的值。
      void setStrategy​(int strategy)
      将压缩策略设置为指定值。
    • 字段详细信息

      • DEFLATED

        public static final int DEFLATED
        减压算法的压缩方法(目前唯一支持的)。
        另请参见:
        Constant Field Values
      • NO_COMPRESSION

        public static final int NO_COMPRESSION
        压缩等级为无压缩。
        另请参见:
        Constant Field Values
      • BEST_SPEED

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

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

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

        public static final int FILTERED
        压缩策略最适用于主要由具有随机分布的小值组成的数据。 强制更多的霍夫曼编码和较少的字符串匹配。
        另请参见:
        Constant Field Values
      • HUFFMAN_ONLY

        public static final int HUFFMAN_ONLY
        仅用于霍夫曼编码的压缩策略。
        另请参见:
        Constant Field Values
      • DEFAULT_STRATEGY

        public static final int DEFAULT_STRATEGY
        默认压缩策略。
        另请参见:
        Constant Field Values
      • FULL_FLUSH

        public static final int FULL_FLUSH
        压缩冲洗模式用于清除所有待处理输出并重置放气器。 使用此模式太频繁可能会严重降低压缩。
        从以下版本开始:
        1.7
        另请参见:
        deflate(byte[], int, int, int)Constant Field Values
    • 构造方法详细信息

      • 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[] b,
                             int off,
                             int len)
        设置压缩输入数据。 当needInput()返回true表示需要更多输入数据时,应该调用此值。
        参数
        b - 输入数据字节
        off - 数据的起始偏移量
        len - 数据的长度
        另请参见:
        needsInput()
      • setInput

        public void setInput​(byte[] b)
        设置压缩输入数据。 当needInput()返回true表示需要更多输入数据时,应该调用此值。
        参数
        b - 输入数据字节
        另请参见:
        needsInput()
      • setDictionary

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

        public void setDictionary​(byte[] b)
        设置压缩预设字典。 当可以预定历史缓冲区时,使用预设字典。 当数据随后用Inflater.inflate()解压缩时,可以调用Inflater.getAdler(),以获得解压缩所需的字典的Adler-32值。
        参数
        b - 字典数据字节
        另请参见:
        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。
        结果
        如果已经达到压缩数据输出流的结束,则为真
      • deflate

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

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

        参数
        b - 压缩数据的缓冲区
        off - 数据的起始偏移量
        len - 压缩数据的最大字节数
        结果
        压缩数据的实际字节数写入输出缓冲区
      • deflate

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

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

        参数
        b - 压缩数据的缓冲区
        结果
        压缩数据的实际字节数写入输出缓冲区
      • deflate

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

        压缩冲洗模式是以下三种模式之一:

        • NO_FLUSH :为了达到最佳压缩(在正常使用情况下应该使用),允许放样器决定在产生输出之前累积多少数据。 此刷新模式中的返回值为0表示应该调用needsInput() ,以确定是否需要更多的输入数据。
        • SYNC_FLUSH :在deflater所有悬而未决的输出被刷新,到指定的输出缓冲器,使该对压缩数据的工作吹气可以得到可到目前为止,所有输入数据(尤其是needsInput()回报true这个调用后,如果提供足够的输出空间)。 SYNC_FLUSH冲洗可能会降低某些压缩算法的压缩,因此只有在必要时才能使用。
        • FULL_FLUSH :所有待处理输出都将与SYNC_FLUSH一起刷新 压缩状态被重置,使得如果先前的压缩数据已被损坏或者需要随机访问,则从压缩输出数据起作用的充气机可以从该点重新启动。 使用FULL_FLUSH也经常会严重降级压缩。

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

        参数
        b - 压缩数据的缓冲区
        off - 数据的起始偏移量
        len - 压缩数据的最大字节数
        flush - 压缩冲洗模式
        结果
        压缩数据的实际字节数写入输出缓冲区
        异常
        IllegalArgumentException - 如果刷新模式无效
        从以下版本开始:
        1.7
      • 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​()
        关闭压缩器并丢弃任何未处理的输入。 当压缩机不再使用时,应该调用此方法,但也可以通过finalize()方法自动调用该方法。 调用此方法后,Deflater对象的行为是未定义的。
      • finalize

        @Deprecated(since="9")
        protected void finalize​()
        已过时。 finalize方法已被弃用。 为了执行清理,覆盖finalize子类应被修改为使用替代清理机制,并删除覆盖的finalize方法。 当覆盖finalize方法时,其实现必须明确确保按照super.finalize()中所述调用super.finalize() 有关迁移选项的更多信息,请参阅Object.finalize()的规范。
        收集垃圾时关闭压缩机。
        重写:
        finalizeObject
        另请参见:
        WeakReferencePhantomReference