此类将字节序列压缩为 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 注意:
-
要释放此
Deflater使用的资源,应显式调用end()方法。子类负责清理子类获取的资源。重写Object.finalize()以执行清理的子类应修改为使用替代清理机制,例如Cleaner并删除重写的finalize方法。 - 自从:
- 1.1
- 参见:
-
字段摘要
字段修饰符和类型Field描述static final int最佳压缩的压缩级别。static final int最快压缩的压缩级别。static final int默认压缩级别。static final int默认压缩策略。static final intdeflate算法的压缩方式(目前唯一支持)。static final int压缩策略最适用于主要由具有某种随机分布的小值组成的数据。static final intCompression flush 模式用于清除所有待处理的输出并重置 deflater。static final int仅用于霍夫曼编码的压缩策略。static final int无压缩的压缩级别。static final int压缩刷新模式用于实现最佳压缩结果。static final intCompression flush mode 用于清除所有待处理的输出;可能会降低某些压缩算法的压缩率。 -
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述intdeflate(byte[] output) 压缩输入数据并用压缩数据填充指定的缓冲区。intdeflate(byte[] output, int off, int len) 压缩输入数据并用压缩数据填充指定的缓冲区。intdeflate(byte[] output, int off, int len, int flush) 压缩输入数据并用压缩数据填充指定的缓冲区。intdeflate(ByteBuffer output) 压缩输入数据并用压缩数据填充指定的缓冲区。intdeflate(ByteBuffer output, int flush) 压缩输入数据并用压缩数据填充指定的缓冲区。voidend()关闭压缩器并丢弃任何未处理的输入。voidfinish()调用时,指示压缩应以输入缓冲区的当前内容结束。booleanfinished()如果已到达压缩数据输出流的末尾,则返回 true。intgetAdler()返回未压缩数据的 ADLER-32 值。long返回到目前为止输入的未压缩字节总数。long返回到目前为止输出的压缩字节总数。int返回到目前为止输入的未压缩字节总数。int返回到目前为止输出的压缩字节总数。boolean如果输入缓冲区中没有数据,则返回 true。voidreset()重置放气器以便可以处理一组新的输入数据。voidsetDictionary(byte[] dictionary) 设置压缩的预设字典。voidsetDictionary(byte[] dictionary, int off, int len) 设置压缩的预设字典。voidsetDictionary(ByteBuffer dictionary) 设置压缩的预设字典。voidsetInput(byte[] input) 设置要压缩的输入数据。voidsetInput(byte[] input, int off, int len) 设置要压缩的输入数据。voidsetInput(ByteBuffer input) 设置要压缩的输入数据。voidsetLevel(int level) 将压缩级别设置为指定值。voidsetStrategy(int strategy) 将压缩策略设置为指定值。
-
字段详细信息
-
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_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
- 参见:
-
SYNC_FLUSH
public static final int SYNC_FLUSHCompression flush mode 用于清除所有待处理的输出;可能会降低某些压缩算法的压缩率。- 自从:
- 1.7
- 参见:
-
FULL_FLUSH
public static final int FULL_FLUSHCompression flush 模式用于清除所有待处理的输出并重置 deflater。过于频繁地使用此模式会严重降低压缩率。- 自从:
- 1.7
- 参见:
-
-
构造方法详细信息
-
Deflater
public Deflater(int level, boolean nowrap) 使用指定的压缩级别创建一个新的压缩器。如果 'nowrap' 为真,则将不使用 ZLIB 标头和校验和字段以支持 GZIP 和 PKZIP 中使用的压缩格式。- 参数:
level- 压缩级别 (0-9)nowrap- 如果为真则使用 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- 数据的长度- 参见:
-
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() 以提供更多输入,则为真
-
finish
public void finish()调用时,指示压缩应以输入缓冲区的当前内容结束。 -
finished
public boolean finished()如果已到达压缩数据输出流的末尾,则返回 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:deflater 中的所有未决输出都被刷新到指定的输出缓冲区,以便处理压缩数据的 inflater 可以获得目前可用的所有输入数据(特别是如果提供了足够的输出空间,则needsInput()在此调用后返回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
压缩输入数据并用压缩数据填充指定的缓冲区。返回压缩数据的实际字节数。压缩刷新模式是以下三种模式之一:
NO_FLUSH:允许压缩器在产生输出之前决定累积多少数据,以实现最佳压缩(应在正常使用场景中使用)。此刷新模式中的返回值 0 表示应调用needsInput()以确定是否需要更多输入数据。SYNC_FLUSH:deflater 中的所有未决输出都被刷新到指定的输出缓冲区,以便处理压缩数据的 inflater 可以获得目前可用的所有输入数据(特别是如果提供了足够的输出空间,则needsInput()在此调用后返回true).使用SYNC_FLUSH刷新可能会降低某些压缩算法的压缩率,因此只应在必要时使用。FULL_FLUSH:与SYNC_FLUSH一样,所有未决输出都被清除。如果先前的压缩数据已损坏或需要随机访问,压缩状态将被重置,以便在压缩输出数据上工作的 inflater 可以从这一点重新启动。经常使用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 对象的行为是不确定的。
-