- java.lang.Object
-
- java.util.zip.Deflater
-
public class Deflaterextends Object
此类使用流行的ZLIB压缩库为通用压缩提供支持。 ZLIB压缩库最初是作为PNG图形标准的一部分开发的,不受专利保护。 它在java.util.zip package description的规范中有详细描述。该类将字节序列压缩为ZLIB压缩数据格式。 输入字节序列通过
setInput()
方法之一在字节数组或字节缓冲区中提供。 输出字节序列被写入传递给deflate()
方法的输出字节数组或字节缓冲区。以下代码片段演示了使用
Deflater
和Inflater
对字符串进行的简单压缩和解压缩。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 }
- API Note:
- 要释放此
Deflater
使用的资源,应显式调用end()
方法。 子类负责清理子类获取的资源。 应修改覆盖finalize()
以执行清理的子类,以使用替代清理机制(如Cleaner
)并删除重写的finalize
方法。 - 实现要求:
- 如果这个
Deflater
已经子类和end
方法已被重写,该end
方法将由最后定稿时调用的时候deflater不可达。 但是子类不应该依赖于这个具体的实现; 最终确定不可靠,并且不推荐使用finalize
方法。 - 从以下版本开始:
- 1.1
- 另请参见:
-
Inflater
-
-
字段汇总
字段 变量和类型 字段 描述 static int
BEST_COMPRESSION
最佳压缩的压缩级别。static int
BEST_SPEED
压缩级别可实现最快压缩。static int
DEFAULT_COMPRESSION
默认压缩级别。static int
DEFAULT_STRATEGY
默认压缩策略。static int
DEFLATED
deflate算法的压缩方法(目前唯一支持的算法)。static int
FILTERED
压缩策略最适用于主要由小值组成的数据,这些值具有一定程度的随机分布。static int
FULL_FLUSH
压缩刷新模式用于清除所有挂起的输出并重置deflater。static int
HUFFMAN_ONLY
仅用于霍夫曼编码的压缩策略。static int
NO_COMPRESSION
无压缩的压缩级别。static int
NO_FLUSH
压缩冲洗模式用于实现最佳压缩效果。static int
SYNC_FLUSH
压缩刷新模式用于清除所有挂起的输出; 可能会降低某些压缩算法的压缩率。
-
方法摘要
所有方法 实例方法 具体的方法 弃用的方法 变量和类型 方法 描述 int
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()
关闭压缩器并丢弃任何未处理的输入。protected void
finalize()
不推荐使用,要删除:此API元素将在以后的版本中删除。finalize
方法已被弃用,将被删除。void
finish()
调用时,表示压缩应以输入缓冲区的当前内容结束。boolean
finished()
如果已到达压缩数据输出流的末尾,则返回true。int
getAdler()
返回未压缩数据的ADLER-32值。long
getBytesRead()
返回到目前为止输入的未压缩字节总数。long
getBytesWritten()
返回到目前为止输出的压缩字节总数。int
getTotalIn()
返回到目前为止输入的未压缩字节总数。int
getTotalOut()
返回到目前为止输出的压缩字节总数。boolean
needsInput()
如果输入缓冲区中没有数据,则返回true。void
reset()
重置deflater,以便处理一组新的输入数据。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)
将压缩策略设置为指定值。
-
-
-
字段详细信息
-
DEFLATED
public static final int DEFLATED
deflate算法的压缩方法(目前唯一支持的算法)。- 另请参见:
- 常数字段值
-
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_ONLY
public static final int HUFFMAN_ONLY
仅用于霍夫曼编码的压缩策略。- 另请参见:
- 常数字段值
-
DEFAULT_STRATEGY
public static final int DEFAULT_STRATEGY
默认压缩策略。- 另请参见:
- 常数字段值
-
NO_FLUSH
public static final int NO_FLUSH
压缩冲洗模式用于实现最佳压缩效果。- 从以下版本开始:
- 1.7
- 另请参见:
-
deflate(byte[], int, int, int)
, 常数字段值
-
SYNC_FLUSH
public static final int SYNC_FLUSH
压缩刷新模式用于清除所有挂起的输出; 可能会降低某些压缩算法的压缩率。- 从以下版本开始:
- 1.7
- 另请参见:
-
deflate(byte[], int, int, int)
, 常数字段值
-
FULL_FLUSH
public static final int FULL_FLUSH
压缩刷新模式用于清除所有挂起的输出并重置deflater。 过于频繁地使用此模式会严重降低压缩性能。- 从以下版本开始:
- 1.7
- 另请参见:
-
deflate(byte[], int, int, int)
, 常数字段值
-
-
构造方法详细信息
-
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[] 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()
方法,表示需要更多输入数据。当执行deflate操作时,给定缓冲区的位置将被提前,直到缓冲区的限制。 可以在放气操作之间修改(重新填充)输入缓冲器; 这样做相当于创建一个新缓冲区并使用此方法进行设置。
在deflate操作的同时修改输入缓冲区的内容,位置或限制将导致未定义的行为,其中可能包括不正确的操作结果或操作失败。
- 参数
-
input
- 输入数据字节 - 从以下版本开始:
- 11
- 另请参见:
-
needsInput()
-
setDictionary
public void setDictionary(byte[] dictionary, int off, int len)
设置压缩的预设字典。 当可以预先确定历史缓冲区时,使用预设字典。 当数据稍后使用Inflater.inflate()解压缩时,可以调用Inflater.getAdler()以获取解压缩所需的字典的Adler-32值。- 参数
-
dictionary
- 字典数据字节 -
off
- 数据的起始偏移量 -
len
- 数据的长度 - 另请参见:
-
Inflater.inflate(byte[], int, int)
,Inflater.getAdler()
-
setDictionary
public void setDictionary(byte[] dictionary)
设置压缩的预设字典。 当可以预先确定历史缓冲区时,使用预设字典。 当数据稍后使用Inflater.inflate()解压缩时,可以调用Inflater.getAdler()以获取解压缩所需的字典的Adler-32值。- 参数
-
dictionary
- 字典数据字节 - 另请参见:
-
Inflater.inflate(byte[], int, int)
,Inflater.getAdler()
-
setDictionary
public void setDictionary(ByteBuffer dictionary)
设置压缩的预设字典。 当可以预先确定历史缓冲区时,使用预设字典。 当数据稍后使用Inflater.inflate()解压缩时,可以调用Inflater.getAdler()以获取解压缩所需的字典的Adler-32值。此方法将完全使用给定字节缓冲区中的字节。 返回时,其位置将等于其限制。
- 参数
-
dictionary
- 字典数据字节 - 另请参见:
-
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。- 结果
- 如果已到达压缩数据输出流的末尾,则为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.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)
产生与调用deflater.deflate(b, 0, b.length, Deflater.NO_FLUSH)
相同的结果。- 参数
-
output
- 压缩数据的缓冲区 - 结果
- 写入输出缓冲区的压缩数据的实际字节数
-
deflate
public int deflate(ByteBuffer output)
压缩输入数据并使用压缩数据填充指定的缓冲区。 返回压缩数据的实际字节数。 返回值0表示应调用needsInput
以确定是否需要更多输入数据。此方法使用
NO_FLUSH
作为其压缩刷新模式。 调用deflater.deflate(output)
形式的此方法deflater.deflate(output)
产生与调用deflater.deflate(output, Deflater.NO_FLUSH)
相同的结果。- 参数
-
output
- 压缩数据的缓冲区 - 结果
- 写入输出缓冲区的压缩数据的实际字节数
- 从以下版本开始:
- 11
-
deflate
public int deflate(byte[] output, int off, int len, int flush)
压缩输入数据并使用压缩数据填充指定的缓冲区。 返回压缩的实际数据字节数。压缩刷新模式是以下三种模式之一:
-
NO_FLUSH
:允许deflater在产生输出之前决定要累积多少数据,以实现最佳压缩(应在正常使用场景中使用)。 此刷新模式下的返回值0表示应调用needsInput()
以确定是否需要更多输入数据。 -
SYNC_FLUSH
:将deflater中的所有挂起输出刷新到指定的输出缓冲区,以便处理压缩数据的inflater可以获得到目前为止所有可用的输入数据(特别是如果提供了足够的输出空间,true
在此调用后返回true
)。 使用SYNC_FLUSH
进行刷新可能会降低某些压缩算法的压缩率,因此只应在必要时使用。 -
FULL_FLUSH
:所有挂起的输出都与SYNC_FLUSH
一样被刷新。 重置压缩状态,以便如果先前的压缩数据已损坏或需要随机访问,则对压缩输出数据起作用的inflater可以从此点重新启动。 经常使用FULL_FLUSH
会严重降低压缩性能。
对于
FULL_FLUSH
或SYNC_FLUSH
,如果返回值为len
,即输出缓冲区b
可用空间,则应使用相同的flush
参数和更多输出空间再次调用此方法。 确保len
大于6,以避免每次调用此方法时重复将标记(5个字节)输出到输出缓冲区。如果调用
setInput(ByteBuffer)
方法为输入提供缓冲区,则输入缓冲区的位置将按此操作消耗的字节数提前。- 参数
-
output
- 压缩数据的缓冲区 -
off
- 数据的起始偏移量 -
len
- 压缩数据的最大字节数 -
flush
- 压缩刷新模式 - 结果
- 写入输出缓冲区的压缩数据的实际字节数
- 异常
-
IllegalArgumentException
- 如果刷新模式无效 - 从以下版本开始:
- 1.7
-
-
deflate
public int deflate(ByteBuffer output, int flush)
压缩输入数据并使用压缩数据填充指定的缓冲区。 返回压缩的实际数据字节数。压缩刷新模式是以下三种模式之一:
-
NO_FLUSH
:允许deflater在产生输出之前决定累积多少数据,以实现最佳压缩(应在正常使用场景中使用)。 此刷新模式下的返回值0表示应调用needsInput()
以确定是否需要更多输入数据。 -
SYNC_FLUSH
:将deflater中的所有挂起输出刷新到指定的输出缓冲区,以便处理压缩数据的inflater可以获得到目前为止所有可用的输入数据(特别是如果提供了足够的输出空间,true
在此调用后返回true
)。 使用SYNC_FLUSH
进行刷新可能会降低某些压缩算法的压缩率,因此只应在必要时使用。 -
FULL_FLUSH
:所有挂起的输出都与SYNC_FLUSH
一样被刷新。 重置压缩状态,以便如果先前的压缩数据已损坏或需要随机访问,则对压缩输出数据起作用的inflater可以从此点重新启动。 经常使用FULL_FLUSH
会严重降低压缩性能。
对于
FULL_FLUSH
或SYNC_FLUSH
,如果返回值等于缓冲区的remaining space ,则应使用相同的flush
参数和更多输出空间再次调用此方法。 确保缓冲区至少有6个字节的剩余空间,以避免每次调用此方法时重写标记(5个字节)重复输出到输出缓冲区。成功时,给定的
output
字节缓冲区的位置将提前操作产生的字节数,该字节数等于此方法返回的数字。如果调用
setInput(ByteBuffer)
方法为输入提供缓冲区,则输入缓冲区的位置将按此操作消耗的字节数提前。- 参数
-
output
- 压缩数据的缓冲区 -
flush
- 压缩刷新模式 - 结果
- 写入输出缓冲区的压缩数据的实际字节数
- 异常
-
IllegalArgumentException
- 如果刷新模式无效 - 从以下版本开始:
- 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()
重置deflater,以便处理一组新的输入数据。 保持当前的压缩级别和策略设置。
-
end
public void end()
关闭压缩器并丢弃任何未处理的输入。 当压缩机不再使用时,应调用此方法。 调用此方法后,Deflater对象的行为未定义。
-
finalize
@Deprecated(since="9", forRemoval=true)protected void finalize()
Deprecated, for removal: This API element is subject to removal in a future version.Thefinalize
method has been deprecated and will be removed. It is implemented as a no-op. Subclasses that overridefinalize
in order to perform cleanup should be modified to use alternative cleanup mechanisms and to remove the overridingfinalize
method. The recommended cleanup for compressor is to explicitly callend
method when it is no longer in use. If theend
is not invoked explicitly the resource of the compressor will be released when the instance becomes unreachable.收集垃圾时关闭压缩机。- 重写:
-
finalize
类Object
- 另请参见:
-
WeakReference
,PhantomReference
-
-