Module java.base
Package java.util.zip

Class Inflater

java.lang.Object
java.util.zip.Inflater

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

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

以下代码片段演示了使用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);

     // 解压缩字节
     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 注意:
要释放此Inflater使用的资源,应显式调用end()方法。子类负责清理子类获取的资源。覆盖Object.finalize()以执行清理的子类应修改为使用替代清理机制,如Cleaner并删除覆盖的finalize方法。
自:
1.1
另请参阅:
  • Constructor Summary

    Constructors
    Constructor
    Description
    创建一个新的解压缩器。
    Inflater(boolean nowrap)
    创建一个新的解压缩器。
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    end()
    关闭解压缩器并丢弃任何未处理的输入。
    boolean
    返回true,如果已到达压缩数据流的末尾。
    int
    返回未压缩数据的ADLER-32值。
    long
    返回到目前为止输入的总压缩字节数。
    long
    返回到目前为止输出的总未压缩字节数。
    int
    返回输入缓冲区中剩余的总字节数。
    int
    返回到目前为止输入的总压缩字节数。
    int
    返回到目前为止输出的总未压缩字节数。
    int
    inflate(byte[] output)
    将字节解压缩到指定的缓冲区。
    int
    inflate(byte[] output, int off, int len)
    将字节解压缩到指定的缓冲区。
    int
    inflate(ByteBuffer output)
    将字节解压缩到指定的缓冲区。
    boolean
    返回true,如果解压缩需要预设字典。
    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
    为解压缩设置输入数据。

    Methods declared in class java.lang.Object

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

    • Inflater

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

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

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

      public Inflater()
      创建一个新的解压缩器。
  • 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)
      将预设字典设置为给定的字节数组。当inflate()返回0且needsDictionary()返回true指示需要预设字典时应调用此方法。方法getAdler()可用于获取所需字典的Adler-32值。
      参数:
      dictionary - 字典数据字节
      off - 数据的起始偏移量
      len - 数据的长度
      另请参阅:
    • setDictionary

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

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

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

      参数:
      dictionary - 字典数据字节
      自:
      11
      另请参阅:
    • getRemaining

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

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

      public boolean needsDictionary()
      返回true,如果解压缩需要预设字典。
      返回:
      如果解压缩需要预设字典,则为true
      另请参阅:
    • 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异常,输入缓冲区的位置也会被此操作消耗的字节数推进。

      剩余字节计数将减少已消耗的输入字节数。如果调用setInput(ByteBuffer)方法提供输入缓冲区,则输入缓冲区的位置将被消耗的字节数推进。

      这些字节总数,以及总读取字节数总写入字节数值,将被更新,即使抛出DataFormatException异常,以反映在异常发生之前消耗和产生的数据量。

      参数:
      output - 用于存放未压缩数据的缓冲区
      off - 数据的起始偏移量
      len - 最大未压缩字节数
      返回:
      实际未压缩的字节数
      抛出:
      DataFormatException - 如果压缩数据格式无效
      参见:
    • inflate

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

      剩余字节计数将减少已消耗的输入字节数。如果调用setInput(ByteBuffer)方法提供输入缓冲区,则输入缓冲区的位置将被消耗的字节数推进。

      这些字节总数,以及总读取字节数总写入字节数值,将被更新,即使抛出DataFormatException异常,以反映在异常发生之前消耗和产生的数据量。

      参数:
      output - 用于存放未压缩数据的缓冲区
      返回:
      实际未压缩的字节数
      抛出:
      DataFormatException - 如果压缩数据格式无效
      参见:
    • inflate

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

      成功后,给定output字节缓冲区的位置将被操作产生的字节数推进,这等于此方法返回的数字。请注意,即使抛出DataFormatException异常,output缓冲区的位置也会被推进。

      剩余字节计数将减少已消耗的输入字节数。如果调用setInput(ByteBuffer)方法提供输入缓冲区,则输入缓冲区的位置将被消耗的字节数推进。

      这些字节总数,以及总读取字节数总写入字节数值,将被更新,即使抛出DataFormatException异常,以反映在异常发生之前消耗和产生的数据量。

      参数:
      output - 用于存放未压缩数据的缓冲区
      返回:
      实际未压缩的字节数
      抛出:
      DataFormatException - 如果压缩数据格式无效
      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()
      关闭解压缩器并丢弃任何未处理的输入。当解压缩器不再使用时应调用此方法。一旦调用此方法,Inflater对象的行为是未定义的。