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. 对比不同压缩级别下的压缩率和耗时
相关推荐
卓码软件测评6 小时前
第三方软件测试机构【性能测试工具用LoadRunner还是JMeter?】
java·功能测试·测试工具·jmeter·性能优化
axban7 小时前
QT M/V架构开发实战:QFileSystemModel介绍
开发语言·qt·架构
钢门狂鸭9 小时前
关于rust的crates.io
开发语言·后端·rust
Lionel_SSL10 小时前
《深入理解Java虚拟机》第三章读书笔记:垃圾回收机制与内存管理
java·开发语言·jvm
记得开心一点嘛10 小时前
手搓Springboot
java·spring boot·spring
技术猿1887027835110 小时前
PHP 与 WebAssembly 的 “天然隔阂”
开发语言·php·wasm
薄荷撞~可乐10 小时前
C#Task(Api)应用
开发语言·c#
老华带你飞10 小时前
租房平台|租房管理平台小程序系统|基于java的租房系统 设计与实现(源码+数据库+文档)
java·数据库·小程序·vue·论文·毕设·租房系统管理平台
独行soc10 小时前
2025年渗透测试面试题总结-66(题目+回答)
java·网络·python·安全·web安全·adb·渗透测试
脑子慢且灵11 小时前
[JavaWeb]模拟一个简易的Tomcat服务(Servlet注解)
java·后端·servlet·tomcat·intellij-idea·web