GZIPOutputStream 类详解
GZIPOutputStream
是 Java 中用于压缩数据为 GZIP 格式 的输出流类,属于 java.util.zip
包。它是 DeflaterOutputStream
的子类,专门生成符合 GZIP 格式(.gz
文件)的压缩数据。
1. 核心功能
- 将数据压缩为 GZIP 格式(RFC 1952 标准)
- 自动添加 GZIP 头尾信息(包括校验和、时间戳等)
- 基于 DEFLATE 压缩算法(与 ZIP 格式共用算法)
2. 类继承关系
OutputStream FilterOutputStream DeflaterOutputStream GZIPOutputStream
3. 构造方法
构造方法 | 说明 |
---|---|
GZIPOutputStream(OutputStream out) |
使用默认缓冲区大小(512B) |
GZIPOutputStream(OutputStream out, int bufferSize) |
指定缓冲区大小 |
GZIPOutputStream(OutputStream out, boolean syncFlush) |
Java 7+ 支持同步刷新 |
GZIPOutputStream(OutputStream out, int bufferSize, boolean syncFlush) |
完整参数控制 |
4. 使用示例
(1)基本压缩流程
java
import java.io.*;
import java.util.zip.GZIPOutputStream;
public class GZIPCompressDemo {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("original.txt");
FileOutputStream fos = new FileOutputStream("compressed.gz");
GZIPOutputStream gzos = new GZIPOutputStream(fos)) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
gzos.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
(2)压缩字符串到内存
java
public static byte[] compressString(String data) throws IOException {
try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
GZIPOutputStream gzos = new GZIPOutputStream(bos)) {
gzos.write(data.getBytes(StandardCharsets.UTF_8));
gzos.finish(); // 必须调用以写入尾部
return bos.toByteArray();
}
}
5. 关键方法
方法 | 说明 |
---|---|
void write(byte[] buf, int off, int len) |
写入待压缩数据 |
void finish() |
完成压缩并写入尾部信息(不关闭流) |
void close() |
关闭流并自动调用 finish() |
setModifiedTime(long time) |
设置头信息中的修改时间(Java 9+) |
6. 工作原理
- 写入 GZIP 头(包含魔数、时间戳等)
- 使用 Deflater 压缩数据(DEFLATE 算法)
- 计算 CRC-32 校验和
- 写入 GZIP 尾部(校验和与原始数据长度)
7. 与 ZIPOutputStream 的区别
特性 | GZIPOutputStream | ZIPOutputStream |
---|---|---|
压缩格式 | 单文件 GZIP 格式 | ZIP 归档格式 |
文件支持 | 只能压缩单个数据流 | 可压缩多文件归档 |
头信息 | 包含 CRC 和时间戳 | 包含文件目录结构 |
典型扩展名 | .gz |
.zip |
8. 重要注意事项
(1)必须调用 finish() 或 close()
- 如果不调用,压缩数据将不完整(缺少尾部校验信息)
- 推荐使用 try-with-resources 自动关闭
(2)设置压缩级别
java
// 通过Deflater设置压缩级别(0-9)
GZIPOutputStream gzos = new GZIPOutputStream(out) {
{ def.setLevel(Deflater.BEST_COMPRESSION); } // 最高压缩比
};
(3)同步刷新(Java 7+)
java
// 确保数据及时刷新到输出流(适合网络传输)
GZIPOutputStream gzos = new GZIPOutputStream(out, true);
9. 性能优化建议
-
使用缓冲流包装 :
javanew GZIPOutputStream(new BufferedOutputStream(rawStream))
-
调整缓冲区大小 :
javanew GZIPOutputStream(rawStream, 8192) // 8KB缓冲区
-
权衡压缩级别 :
Deflater.BEST_SPEED
(1)快速压缩Deflater.BEST_COMPRESSION
(9)高压缩比
10. 实际应用场景
- Web 服务器 :压缩 HTTP 响应体(需设置
Content-Encoding: gzip
) - 日志归档:压缩历史日志文件
- 数据传输:减少网络传输量
总结
GZIPOutputStream
是生成 GZIP 格式压缩数据的标准工具- 必须正确关闭流以保证数据完整性
- 可通过缓冲和压缩级别调优性能
扩展练习:
- 实现一个 GZIP 压缩工具,支持压缩级别选择
- 对比不同压缩级别下的压缩率和耗时