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

Class Inflater


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

    该类膨胀ZLIB压缩字节序列。 输入字节序列通过setInput()方法之一以字节数组或字节缓冲区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);
    
         // 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:
    要释放此Inflater使用的资源,应显式调用end()方法。 子类负责清理子类获取的资源。 应修改覆盖finalize()以执行清理的子类,以使用替代清理机制(如Cleaner并删除重写的finalize方法。
    实现要求:
    如果这个Inflater已经子类和end方法已被重写,该end方法将被终结时调用充气不可达。 但是子类不应该依赖于这个具体的实现; 最终确定不可靠,并且不推荐使用finalize方法。
    从以下版本开始:
    1.1
    另请参见:
    Deflater
    • 构造方法摘要

      构造方法  
      构造器 描述
      Inflater()
      创建一个新的解压缩程序。
      Inflater​(boolean nowrap)
      创建一个新的解压缩程序。
    • 方法摘要

      所有方法  实例方法 具体的方法  弃用的方法 
      变量和类型 方法 描述
      void end()
      关闭解压缩器并丢弃任何未处理的输入。
      protected void finalize()
      不推荐使用,要删除:此API元素将在以后的版本中删除。
      finalize方法已被弃用,将被删除。
      boolean finished()
      如果已到达压缩数据流的末尾,则返回true。
      int getAdler()
      返回未压缩数据的ADLER-32值。
      long getBytesRead()
      返回到目前为止输入的压缩字节总数。
      long getBytesWritten()
      返回到目前为止输出的未压缩字节总数。
      int getRemaining()
      返回输入缓冲区中剩余的总字节数。
      int getTotalIn()
      返回到目前为止输入的压缩字节总数。
      int getTotalOut()
      返回到目前为止输出的未压缩字节总数。
      int inflate​(byte[] output)
      将字节解压缩到指定的缓冲区。
      int inflate​(byte[] output, int off, int len)
      将字节解压缩到指定的缓冲区。
      int inflate​(ByteBuffer output)
      将字节解压缩到指定的缓冲区。
      boolean needsDictionary()
      如果解压缩需要预设字典,则返回true。
      boolean needsInput()
      如果输入缓冲区中没有数据,则返回true。
      void reset()
      重置inflater以便可以处理一组新的输入数据。
      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)
      设置解压缩的输入数据。
    • 构造方法详细信息

      • Inflater

        public Inflater​(boolean nowrap)
        创建一个新的解压缩程序。 如果参数'nowrap'为true,则不使用ZLIB头和校验和字段。 这提供了与GZIP和PKZIP使用的压缩格式的兼容性。

        注意:使用'nowrap'选项时,还需要提供额外的“虚拟”字节作为输入。 这是ZLIB本机库所必需的,以支持某些优化。

        参数
        nowrap - 如果为true,则支持GZIP兼容压缩
      • Inflater

        public Inflater()
        创建一个新的解压缩程序。
    • 方法详细信息

      • 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()方法之一,表示需要更多输入数据。

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

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

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

        public void setDictionary​(byte[] dictionary,
                                  int off,
                                  int len)
        将预设字典设置为给定的字节数组。 应该在inflate()返回0时调用,needsDictionary()返回true,表示需要预设字典。 getAdler()方法可用于获取所需字典的Adler-32值。
        参数
        dictionary - 字典数据字节
        off - 数据的起始偏移量
        len - 数据的长度
        另请参见:
        needsDictionary()getAdler()
      • setDictionary

        public void setDictionary​(byte[] dictionary)
        将预设字典设置为给定的字节数组。 应该在inflate()返回0时调用,needsDictionary()返回true,表示需要预设字典。 getAdler()方法可用于获取所需字典的Adler-32值。
        参数
        dictionary - 字典数据字节
        另请参见:
        needsDictionary()getAdler()
      • setDictionary

        public void setDictionary​(ByteBuffer dictionary)
        将预设字典设置为给定缓冲区中的字节。 应该在inflate()返回0时调用,needsDictionary()返回true,表示需要预设字典。 getAdler()方法可用于获取所需字典的Adler-32值。

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

        参数
        dictionary - 字典数据字节
        从以下版本开始:
        11
        另请参见:
        needsDictionary()getAdler()
      • getRemaining

        public int getRemaining()
        返回输入缓冲区中剩余的总字节数。 这可以用于找出解压缩完成后仍然保留在输入缓冲区中的字节。
        结果
        输入缓冲区中剩余的总字节数
      • needsInput

        public boolean needsInput()
        如果输入缓冲区中没有数据,则返回true。 这可用于确定是否应调用其中一个setInput()方法以提供更多输入。
        结果
        如果输入缓冲区中没有数据,则为true
      • needsDictionary

        public boolean needsDictionary()
        如果解压缩需要预设字典,则返回true。
        结果
        如果解压缩需要预设字典,则为true
        另请参见:
        setDictionary(byte[], int, int)
      • finished

        public boolean finished()
        如果已到达压缩数据流的末尾,则返回true。
        结果
        如果已到达压缩数据流的末尾,则为true
      • inflate

        public int inflate​(byte[] output,
                           int off,
                           int len)
                    throws DataFormatException
        将字节解压缩到指定的缓冲区。 返回未压缩的实际字节数。 返回值0表示应调用needsInput()或needsDictionary()以确定是否需要更多输入数据或预设字典。 在后一种情况下,getAdler()可用于获取所需字典的Adler-32值。

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

        remaining byte count将减少消耗的输入字节数。 如果调用setInput(ByteBuffer)方法为输入提供缓冲区,则输入缓冲区的位置将提前消耗的字节数。

        即使在抛出DataFormatException以反映在异常发生之前消耗和生成的数据量的情况下,这些字节总数以及total bytes readtotal bytes written值也将更新。

        参数
        output - 未压缩数据的缓冲区
        off - 数据的起始偏移量
        len - 未压缩字节的最大数量
        结果
        实际的未压缩字节数
        异常
        DataFormatException - 如果压缩数据格式无效
        另请参见:
        needsInput()needsDictionary()
      • inflate

        public int inflate​(byte[] output)
                    throws DataFormatException
        将字节解压缩到指定的缓冲区。 返回未压缩的实际字节数。 返回值0表示应调用needsInput()或needsDictionary()以确定是否需要更多输入数据或预设字典。 在后一种情况下,getAdler()可用于获取所需字典的Adler-32值。

        remaining byte count将减少消耗的输入字节数。 如果调用setInput(ByteBuffer)方法为输入提供缓冲区,则输入缓冲区的位置将提前消耗的字节数。

        即使在抛出DataFormatException以反映在异常发生之前消耗和生成的数据量的情况下,这些字节总数以及total bytes readtotal bytes written值也将更新。

        参数
        output - 未压缩数据的缓冲区
        结果
        实际的未压缩字节数
        异常
        DataFormatException - 如果压缩数据格式无效
        另请参见:
        needsInput()needsDictionary()
      • inflate

        public int inflate​(ByteBuffer output)
                    throws DataFormatException
        将字节解压缩到指定的缓冲区。 返回未压缩的实际字节数。 返回值0表示应调用needsInput()或needsDictionary()以确定是否需要更多输入数据或预设字典。 在后一种情况下,getAdler()可用于获取所需字典的Adler-32值。

        成功时,给定的output字节缓冲区的位置将提前操作产生的字节数,该字节数等于此方法返回的数字。 需要注意的是位置output缓冲区将即使在一个事件被推进DataFormatException被抛出。

        remaining byte count将减少消耗的输入字节数。 如果调用setInput(ByteBuffer)方法为输入提供缓冲区,则输入缓冲区的位置将提前消耗的字节数。

        即使在抛出DataFormatException以反映在异常发生之前消耗和生成的数据量的情况下,这些字节总数以及total bytes readtotal bytes written值也将更新。

        参数
        output - 未压缩数据的缓冲区
        结果
        实际的未压缩字节数
        异常
        DataFormatException - 如果压缩数据格式无效
        ReadOnlyBufferException - 如果给定的输出缓冲区是只读的
        从以下版本开始:
        11
        另请参见:
        needsInput()needsDictionary()
      • 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()
        重置inflater以便可以处理一组新的输入数据。
      • end

        public void end()
        关闭解压缩器并丢弃任何未处理的输入。 当不再使用解压缩程序时,应调用此方法。 调用此方法后,Inflater对象的行为未定义。
      • 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 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,
        收集垃圾时关闭解压缩程序。
        重写:
        finalize在类 Object
        实现要求:
        如果这个 Inflater已经子类和 end方法已被重写,该 end当充气不可达的方法将被调用。
        另请参见:
        WeakReferencePhantomReference