该类将字节序列压缩为ZLIB压缩数据格式。输入字节序列通过其中一个setInput()
方法以字节数组或字节缓冲区的形式提供。输出字节序列写入传递给deflate()
方法的输出字节数组或字节缓冲区。
以下代码片段演示了使用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); compresser.end(); // 解压缩字节 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 注意:
-
要释放此
Deflater
使用的资源,应显式调用end()
方法。子类负责清理子类获取的资源。覆盖Object.finalize()
以执行清理的子类应修改为使用替代清理机制,如Cleaner
并删除覆盖的finalize
方法。 - 自:
- 1.1
- 另请参见:
-
Field Summary
Modifier and TypeFieldDescriptionstatic final int
最佳压缩的压缩级别。static final int
最快压缩的压缩级别。static final int
默认压缩级别。static final int
默认压缩策略。static final int
deflate算法的压缩方法(目前仅支持的方法)。static final int
最适合由大部分小值组成且具有较随机分布的数据的压缩策略。强制执行更多的Huffman编码和更少的字符串匹配。static final int
用于刷新所有挂起输出并重置压缩器的压缩刷新模式。static final int
仅用于Huffman编码的压缩策略。static final int
无压缩的压缩级别。static final int
用于实现最佳压缩结果的压缩刷新模式。static final int
用于刷新所有挂起输出的压缩刷新模式;可能会降低某些压缩算法的压缩效果。 -
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionint
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()
关闭压缩器并丢弃任何未处理的输入。void
finish()
调用时,表示应该以输入缓冲区的当前内容结束压缩。boolean
finished()
返回true,如果已到达压缩数据输出流的末尾。int
getAdler()
返回未压缩数据的ADLER-32值。long
迄今为止输入的未压缩字节数总数。long
迄今为止输出的压缩字节数总数。int
迄今为止输入的未压缩字节数总数。int
迄今为止输出的压缩字节数总数。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) 为压缩设置输入数据。void
setLevel
(int level) 将压缩级别设置为指定值。void
setStrategy
(int strategy) 将压缩策略设置为指定值。
-
Field Details
-
DEFLATED
public static final int DEFLATEDdeflate算法的压缩方法(目前仅支持的方法)。- 另请参见:
-
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编码和更少的字符串匹配。- 另请参见:
-
HUFFMAN_ONLY
public static final int HUFFMAN_ONLY仅用于Huffman编码的压缩策略。- 另请参见:
-
DEFAULT_STRATEGY
public static final int DEFAULT_STRATEGY默认压缩策略。- 另请参见:
-
NO_FLUSH
public static final int NO_FLUSH用于实现最佳压缩结果的压缩刷新模式。- 自:
- 1.7
- 另请参见:
-
SYNC_FLUSH
public static final int SYNC_FLUSH用于刷新所有挂起输出的压缩刷新模式;可能会降低某些压缩算法的压缩效果。- 自:
- 1.7
- 另请参见:
-
FULL_FLUSH
public static final int FULL_FLUSH用于刷新所有挂起输出并重置压缩器的压缩刷新模式。过于频繁地使用此模式可能严重降低压缩效果。- 自:
- 1.7
- 另请参见:
-
-
Constructor Details
-
Deflater
public Deflater(int level, boolean nowrap) 使用指定的压缩级别创建新的压缩器。如果'nowrap'为true,则不会使用ZLIB头和校验和字段,以支持GZIP和PKZIP中使用的压缩格式。- 参数:
-
level
- 压缩级别(0-9) -
nowrap
- 如果为true,则使用GZIP兼容的压缩
-
Deflater
public Deflater(int level) 使用指定的压缩级别创建新的压缩器。生成的压缩数据将采用ZLIB格式。- 参数:
-
level
- 压缩级别(0-9)
-
Deflater
public Deflater()使用默认压缩级别创建新的压缩器。生成的压缩数据将采用ZLIB格式。
-
-
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) 为压缩设置预设字典。当历史缓冲区可以预先确定时,将使用预设字典。当稍后使用Inflater.inflate()解压缩数据时,可以调用Inflater.getAdler()以获取解压缩所需的字典的Adler-32值。- 参数:
-
dictionary
- 字典数据字节 -
off
- 数据的起始偏移量 -
len
- 数据的长度 - 参见:
-
setDictionary
public void setDictionary(byte[] dictionary) 为压缩设置预设字典。当历史缓冲区可以预先确定时,将使用预设字典。当稍后使用Inflater.inflate()解压缩数据时,可以调用Inflater.getAdler()以获取解压缩所需的字典的Adler-32值。- 参数:
-
dictionary
- 字典数据字节 - 参见:
-
setDictionary
为压缩设置预设字典。当历史缓冲区可以预先确定时,将使用预设字典。当稍后使用Inflater.inflate()解压缩数据时,可以调用Inflater.getAdler()以获取解压缩所需的字典的Adler-32值。给定的字节缓冲区中的字节将被此方法完全消耗。返回时,其位置将等于其限制。
- 参数:
-
dictionary
- 字典数据字节 - 参见:
-
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.NO_FLUSH)
的结果相同。- 参数:
-
output
- 用于压缩数据的缓冲区 -
off
- 数据的起始偏移量 -
len
- 压缩数据的最大字节数 - 返回:
- 写入输出缓冲区的压缩数据的实际字节数
-
deflate
public int deflate(byte[] output) 压缩输入数据并使用压缩数据填充指定的缓冲区。返回压缩数据的实际字节数。返回值为0表示应调用needsInput
以确定是否需要更多输入数据。此方法使用
NO_FLUSH
作为其压缩刷新模式。调用此方法的形式deflater.deflate(b)
的结果与调用deflater.deflate(b, 0, b.length, Deflater.NO_FLUSH)
的结果相同。- 参数:
-
output
- 用于压缩数据的缓冲区 - 返回:
- 写入输出缓冲区的压缩数据的实际字节数
-
deflate
压缩输入数据并使用压缩数据填充指定的缓冲区。返回压缩数据的实际字节数。返回值为0表示应调用needsInput
以确定是否需要更多输入数据。此方法使用
NO_FLUSH
作为其压缩刷新模式。调用此方法的形式deflater.deflate(output)
的结果与调用deflater.deflate(output, Deflater.NO_FLUSH)
的结果相同。- 参数:
-
output
- 用于压缩数据的缓冲区 - 返回:
- 写入输出缓冲区的压缩数据的实际字节数
- 抛出:
-
ReadOnlyBufferException
- 如果给定的输出缓冲区是只读的 - 自版本:
- 11
-
deflate
public int deflate(byte[] output, int off, int len, int flush) 压缩输入数据并使用压缩数据填充指定的缓冲区。返回压缩数据的实际字节数。压缩刷新模式有以下三种模式:
NO_FLUSH
:允许压缩器决定累积多少数据后才产生输出,以实现最佳压缩(应在正常使用场景中使用)。在此刷新模式下,返回值为0表示应调用needsInput()
以确定是否需要更多输入数据。SYNC_FLUSH
:刷新压缩器中的所有挂起输出到指定的输出缓冲区,以便对压缩数据进行操作的解压缩器可以获取到目前为止所有可用的输入数据(特别是在提供足够输出空间后,needsInput()
返回true
)。使用SYNC_FLUSH
可能会降低某些压缩算法的压缩效果,因此仅在必要时使用。FULL_FLUSH
:将所有挂起输出刷新,与SYNC_FLUSH
相同。重置压缩状态,以便对压缩输出数据进行操作的解压缩器可以从此点重新开始,如果之前的压缩数据已损坏或需要随机访问。过于频繁地使用FULL_FLUSH
可能会严重降低压缩效果。
在
FULL_FLUSH
或SYNC_FLUSH
的情况下,如果返回值为len
,即输出缓冲区中的可用空间,应再次使用相同的flush
参数调用此方法,并提供更多的输出空间。确保len
大于6,以避免在每次调用此方法时重复输出刷新标记(5字节)到输出缓冲区。如果调用
setInput(ByteBuffer)
方法以提供输入缓冲区,则输入缓冲区的位置将会随着此操作消耗的字节数而前进。- 参数:
-
output
- 用于压缩数据的缓冲区 -
off
- 数据的起始偏移量 -
len
- 压缩数据的最大字节数 -
flush
- 压缩刷新模式 - 返回:
- 写入输出缓冲区的压缩数据的实际字节数
- 抛出:
-
IllegalArgumentException
- 如果刷新模式无效 - 自版本:
- 1.7
-
deflate
压缩输入数据,并使用压缩数据填充指定的缓冲区。返回实际压缩的数据字节数。压缩刷新模式是以下三种模式之一:
NO_FLUSH
:允许压缩器决定在产生输出之前累积多少数据,以实现最佳压缩(应在正常使用场景中使用)。在此刷新模式下返回值为0表示应调用needsInput()
以确定是否需要更多输入数据。SYNC_FLUSH
:刷新压缩器中的所有挂起输出到指定的输出缓冲区,以便处理压缩数据的解压器可以获取到目前为止所有可用的输入数据(特别是在此调用后,如果提供足够的输出空间,needsInput()
将返回true
)。使用SYNC_FLUSH
可能会降低某些压缩算法的压缩效果,因此仅在必要时使用。FULL_FLUSH
:所有挂起的输出都会像SYNC_FLUSH
一样被刷新。压缩状态将被重置,以便处理压缩输出数据的解压器可以从此点重新开始,如果之前的压缩数据已损坏或需要随机访问。过于频繁地使用FULL_FLUSH
可能会严重降低压缩效果。
在
FULL_FLUSH
或SYNC_FLUSH
的情况下,如果返回值等于缓冲区的剩余空间,则应再次使用相同的flush
参数调用此方法,并提供更多的输出空间。确保缓冲区至少有6个字节的剩余空间,以避免在每次调用此方法时重复输出刷新标记(5个字节)到输出缓冲区。成功时,给定
output
字节缓冲区的位置将向前移动与此操作生成的字节数相同,即与此方法返回的数字相同。如果调用了
setInput(ByteBuffer)
方法以提供输入缓冲区,则输入缓冲区的位置将向前移动此操作消耗的字节数。- 参数:
-
output
- 用于压缩数据的缓冲区 -
flush
- 压缩刷新模式 - 返回:
- 写入输出缓冲区的实际压缩数据字节数
- 抛出:
-
IllegalArgumentException
- 如果刷新模式无效 -
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()关闭压缩器并丢弃任何未处理的输入。当不再使用压缩器时应调用此方法。一旦调用此方法,Deflater对象的行为将变得不确定。
-