GZIPOutputStream 类详解

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. 工作原理

  1. 写入 GZIP 头(包含魔数、时间戳等)
  2. 使用 Deflater 压缩数据(DEFLATE 算法)
  3. 计算 CRC-32 校验和
  4. 写入 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. 性能优化建议

  1. 使用缓冲流包装

    java 复制代码
    new GZIPOutputStream(new BufferedOutputStream(rawStream))
  2. 调整缓冲区大小

    java 复制代码
    new GZIPOutputStream(rawStream, 8192) // 8KB缓冲区
  3. 权衡压缩级别

    • Deflater.BEST_SPEED(1)快速压缩
    • Deflater.BEST_COMPRESSION(9)高压缩比

10. 实际应用场景

  • Web 服务器 :压缩 HTTP 响应体(需设置 Content-Encoding: gzip
  • 日志归档:压缩历史日志文件
  • 数据传输:减少网络传输量

总结

  • GZIPOutputStream 是生成 GZIP 格式压缩数据的标准工具
  • 必须正确关闭流以保证数据完整性
  • 可通过缓冲和压缩级别调优性能

扩展练习

  1. 实现一个 GZIP 压缩工具,支持压缩级别选择
  2. 对比不同压缩级别下的压缩率和耗时
相关推荐
码智社9 分钟前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海11 分钟前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖1 小时前
JDK 26 新特性详解
java·开发语言
马优晨2 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区3 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大4 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai4 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说4 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
এ慕ོ冬℘゜4 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa5 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio