该类解压缩ZLIB压缩字节序列。输入字节序列通过其中一个setInput()
方法以字节数组或字节缓冲区的形式提供。输出字节序列写入传递给inflate()
方法的输出字节数组或字节缓冲区。
以下代码片段演示了使用Deflater
和Inflater
对字符串进行简单压缩和解压缩。
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
-
Method Summary
Modifier and TypeMethodDescriptionvoid
end()
关闭解压缩器并丢弃任何未处理的输入。boolean
finished()
返回true,如果已到达压缩数据流的末尾。int
getAdler()
返回未压缩数据的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
setInput
(ByteBuffer input) 为解压缩设置输入数据。
-
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
为解压缩设置输入数据。每当
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
将预设字典设置为给定缓冲区中的字节。当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
将字节解压缩到指定的缓冲区。返回实际解压缩的字节数。返回值为0表示需要调用needsInput()或needsDictionary()来确定是否需要更多输入数据或预设字典。在后一种情况下,可以使用getAdler()来获取所需字典的Adler-32值。如果调用
setInput(ByteBuffer)
方法提供输入缓冲区,则即使抛出DataFormatException
异常,输入缓冲区的位置也会被此操作消耗的字节数推进。剩余字节计数将减少已消耗的输入字节数。如果调用
setInput(ByteBuffer)
方法提供输入缓冲区,则输入缓冲区的位置将被消耗的字节数推进。这些字节总数,以及总读取字节数和总写入字节数值,将被更新,即使抛出
DataFormatException
异常,以反映在异常发生之前消耗和产生的数据量。- 参数:
-
output
- 用于存放未压缩数据的缓冲区 -
off
- 数据的起始偏移量 -
len
- 最大未压缩字节数 - 返回:
- 实际未压缩的字节数
- 抛出:
-
DataFormatException
- 如果压缩数据格式无效 - 参见:
-
inflate
将字节解压缩到指定的缓冲区。返回实际解压缩的字节数。返回值为0表示需要调用needsInput()或needsDictionary()来确定是否需要更多输入数据或预设字典。在后一种情况下,可以使用getAdler()来获取所需字典的Adler-32值。剩余字节计数将减少已消耗的输入字节数。如果调用
setInput(ByteBuffer)
方法提供输入缓冲区,则输入缓冲区的位置将被消耗的字节数推进。这些字节总数,以及总读取字节数和总写入字节数值,将被更新,即使抛出
DataFormatException
异常,以反映在异常发生之前消耗和产生的数据量。- 参数:
-
output
- 用于存放未压缩数据的缓冲区 - 返回:
- 实际未压缩的字节数
- 抛出:
-
DataFormatException
- 如果压缩数据格式无效 - 参见:
-
inflate
将字节解压缩到指定的缓冲区。返回实际解压缩的字节数。返回值为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对象的行为是未定义的。
-