Golang如何使用compress/gzip实现文件压缩

使用compress/gzip包可实现Go语言文件压缩,需打开源文件并创建.gz目标文件,通过gzip.NewWriter包装写入器,将源内容拷贝至写入器,并调用Close()确保尾部信息写入。

在Go语言中,使用 compress/gzip 包可以轻松实现文件的GZIP压缩。这个包通常与 osbufio 等标准库配合使用,完成从读取原始文件到生成压缩文件的流程。

1. 基本流程说明

要压缩一个文件,主要步骤如下:

  • 打开需要压缩的源文件
  • 创建一个以 .gz 结尾的目标文件
  • 用 gzip.NewWriter 将目标文件包装成GZIP写入器
  • 将源文件内容拷贝到GZIP写入器中
  • 关闭GZIP写入器(必须调用 Close() 来写入尾部校验)

2. 实现文件压缩的完整代码示例

package main

import (
    "bufio"
    "compress/gzip"
    "io"
    "os"
)

func compressFile(src, dst string) error {
    // 打开源文件
    inputFile, err := os.Open(src)
    if err != nil {
        return err
    }
    defer inputFile.Close()

    // 创建目标 .gz 文件
    outputFile, err := os.Create(dst)
    if err != nil {
        return err
    }
    defer outputFile.Close()

    // 使用 bufio 提升I/O性能
    writer := bufio.NewWriter(outputFile)
    defer writer.Flush()

    // 构建gzip写入器
    gzWriter := gzip.NewWriter(writer)
    defer gzWriter.Close()

    // 将源文件内容拷贝到gzip写入器
    _, err = io.Copy(gzWriter, inputFile)
    return err
}

func main() {
    err := compressFile("example.txt", "example.txt.gz")
    if err != nil {
        panic(err)
    }
    println("文件压缩完成")
}

3. 关键注意事项

使用 compress/gzip 时有几个关键点需要注意:

  • 必须调用 gzWriter.Close():这一步会写入GZIP尾部的CRC和长度信息,如果跳过会导致压缩文件损坏
  • 建议使用 bufio.Writer 提高写入效率,减少系统调用次数
  • 文件扩展名通常为 .gz,但不是强制要求
  • gzip压缩的是单个文件,不支持目录打包(如需打包多文件应结合 tar 使用)

4. 可选:设置压缩级别

gzip.NewWriterLevel 可以指定压缩等级,例如:

gzWriter, err := gzip.NewWriterLevel(writer, gzip.BestCompression)
if err != nil {
    return err
}

可用等级包括:

  • gzip.BestSpeed(最快)
  • gzip.BestCompression(最高压缩比)
  • gzip.DefaultCompression(默认)
  • 0-9 的整数(0=不压缩,9=最高压缩)
基本上就这些。只要按流程操作,并注意关闭写入器,就能正确生成GZIP压缩文件。