GZIPOutputStream 类详解
 
GZIPOutputStream 是 Java 中用于压缩数据为 GZIP 格式的输出流类,属于 java.util.zip 包。它是 DeflaterOutputStream 的子类,专门生成符合 GZIP 格式(.gz 文件)的压缩数据。
 
 
1. 核心功能
 
- 将数据压缩为 GZIP 格式(RFC 1952 标准)
- 自动添加 GZIP 头尾信息(包括校验和、时间戳等)
- 基于 DEFLATE 压缩算法(与 ZIP 格式共用算法)
 
2. 类继承关系
 
  
  
 
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)基本压缩流程
 
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)压缩字符串到内存
 
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)设置压缩级别
 
GZIPOutputStream gzos = new GZIPOutputStream(out) {{ def.setLevel(Deflater.BEST_COMPRESSION); } 
};
 
(3)同步刷新(Java 7+)
 
GZIPOutputStream gzos = new GZIPOutputStream(out, true);
 
 
9. 性能优化建议
 
- 使用缓冲流包装:new GZIPOutputStream(new BufferedOutputStream(rawStream))
 
- 调整缓冲区大小:new GZIPOutputStream(rawStream, 8192) 
 
- 权衡压缩级别: - Deflater.BEST_SPEED(1)快速压缩
- Deflater.BEST_COMPRESSION(9)高压缩比
 
 
10. 实际应用场景
 
- Web 服务器:压缩 HTTP 响应体(需设置 Content-Encoding: gzip)
- 日志归档:压缩历史日志文件
- 数据传输:减少网络传输量
 
总结
 
- GZIPOutputStream是生成 GZIP 格式压缩数据的标准工具
- 必须正确关闭流以保证数据完整性
- 可通过缓冲和压缩级别调优性能
扩展练习:
 
- 实现一个 GZIP 压缩工具,支持压缩级别选择
- 对比不同压缩级别下的压缩率和耗时