Gzip适合单文件或数据流的高效压缩,如HTTP响应、日志归档;Zip则适用于多文件打包,能保留目录结构和元数据,常用于文件分发与备份。

Golang处理文件压缩,通常我们会用到标准库中的
compress/gzip
archive/zip
gzip
zip
在Go语言里,处理文件压缩这事儿,
gzip
zip
compress/gzip
package main
import (
"bytes"
"compress/gzip"
"fmt"
"io"
"os"
"path/filepath"
)
// Gzip压缩数据
func gzipCompress(data []byte) ([]byte, error) {
var b bytes.Buffer
w := gzip.NewWriter(&b)
_, err := w.Write(data)
if err != nil {
return nil, fmt.Errorf("写入数据失败: %w", err)
}
if err := w.Close(); err != nil { // 记得关闭writer,否则数据可能不完整
return nil, fmt.Errorf("关闭gzip writer失败: %w", err)
}
return b.Bytes(), nil
}
// Gzip解压缩数据
func gzipDecompress(data []byte) ([]byte, error) {
r, err := gzip.NewReader(bytes.NewReader(data))
if err != nil {
return nil, fmt.Errorf("创建gzip reader失败: %w", err)
}
defer r.Close() // 延迟关闭reader
decompressedData, err := io.ReadAll(r)
if err != nil {
return nil, fmt.Errorf("读取解压数据失败: %w", err)
}
return decompressedData, nil
}
// 简单示例
func main() {
originalData := []byte("这是我想要用gzip压缩的一段文本,看它能压缩成什么样。")
fmt.Printf("原始数据大小: %d 字节\n", len(originalData))
compressed, err := gzipCompress(originalData)
if err != nil {
fmt.Println("压缩失败:", err)
return
}
fmt.Printf("Gzip压缩后大小: %d 字节\n", len(compressed))
decompressed, err := gzipDecompress(compressed)
if err != nil {
fmt.Println("解压失败:", err)
return
}
fmt.Printf("Gzip解压后数据: %s\n", string(decompressed))
fmt.Println("解压数据与原始数据是否一致:", bytes.Equal(originalData, decompressed))
}而
archive/zip
.zip
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"archive/zip"
"io"
"os"
"path/filepath"
"fmt"
)
// 创建zip文件,将多个文件添加到其中
func createZipArchive(zipFilePath string, filesToArchive map[string][]byte) error {
outFile, err := os.Create(zipFilePath)
if err != nil {
return fmt.Errorf("创建zip文件失败: %w", err)
}
defer outFile.Close()
zipWriter := zip.NewWriter(outFile)
defer zipWriter.Close() // 记得关闭zip writer,才能完成写入
for fileName, fileContent := range filesToArchive {
// 创建文件头,可以设置压缩方法等
header := &zip.FileHeader{
Name: fileName,
Method: zip.Deflate, // 默认使用Deflate压缩
}
writer, err := zipWriter.CreateHeader(header)
if err != nil {
return fmt.Errorf("创建zip文件头失败 (%s): %w", fileName, err)
}
_, err = writer.Write(fileContent)
if err != nil {
return fmt.Errorf("写入文件内容失败 (%s): %w", fileName, err)
}
}
return nil
}
// 解压zip文件到指定目录
func extractZipArchive(zipFilePath, destDir string) error {
r, err := zip.OpenReader(zipFilePath)
if err != nil {
return fmt.Errorf("打开zip文件失败: %w", err)
}
defer r.Close()
for _, f := range r.File {
filePath := filepath.Join(destDir, f.Name)
// 检查是否是目录
if f.FileInfo().IsDir() {
os.MkdirAll(filePath, f.Mode())
continue
}
// 确保目标目录存在
if err := os.MkdirAll(filepath.Dir(filePath), 0755); err != nil {
return fmt.Errorf("创建目录失败 (%s): %w", filepath.Dir(filePath), err)
}
outFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
if err != nil {
return fmt.Errorf("创建输出文件失败 (%s): %w", filePath, err)
}
rc, err := f.Open()
if err != nil {
outFile.Close()
return fmt.Errorf("打开zip内部文件失败 (%s): %w", f.Name, err)
}
_, err = io.Copy(outFile, rc) // 使用io.Copy提高效率
outFile.Close() // 及时关闭文件句柄
rc.Close()
if err != nil {
return fmt.Errorf("复制文件内容失败 (%s): %w", f.Name, err)
}
}
return nil
}
// 简单示例
func main() {
// 创建一些模拟文件内容
files := map[string][]byte{
"file1.txt": []byte("这是第一个文件的内容。"),
"folder/file2.log": []byte("这是第二个文件,它在一个子文件夹里。\n日志信息..."),
"image.jpg": []byte("模拟图片二进制数据..."), // 实际应用中会是真实图片数据
}
zipFileName := "my_archive.zip"
extractDir := "extracted_files"
// 创建zip文件
fmt.Println("开始创建zip文件...")
err := createZipArchive(zipFileName, files)
if err != nil {
fmt.Println("创建zip失败:", err)
return
}
fmt.Println("zip文件创建成功:", zipFileName)
// 解压zip文件
fmt.Println("开始解压zip文件...")
err = extractZipArchive(zipFileName, extractDir)
if err != nil {
fmt.Println("解压zip失败:", err)
return
}
fmt.Println("zip文件解压成功到:", extractDir)
// 清理(可选)
// os.Remove(zipFileName)
// os.RemoveAll(extractDir)
}说实话,我个人觉得,当你主要关注的是“数据流”的压缩效率和传输速度时,
gzip
Accept-Encoding: gzip
net/http
compress/gzip
Gzip的优势在于其简洁性和流式处理能力。它没有Zip那种复杂的归档结构,因此在处理单个文件或连续数据流时,性能开销更小,启动更快。
Zip包的优势,在我看来,主要体现在它作为一种“容器”的能力上。它不仅仅是压缩,更是一种文件管理和分发的解决方案,特别适合以下这些情况:
zip
.zip
archive/zip
Zip的强大之处在于它能维护文件间的关系(目录结构),并且能存储每个文件的元数据。虽然它在处理大量小文件时可能会有额外的开销(每个文件都需要一个条目),但在需要“集合”和“组织”文件的场景下,它是无可替代的。
从我实践的经验来看,
gzip
zip
性能方面:
gzip
zip
gzip
gzip
zip
适用性方面:
gzip
zip
zip
zip
总的来说,如果你面对的是一个连续的数据流,或者仅仅是一个文件,并且对压缩速度有较高要求,
gzip
zip
gzip
zip
以上就是Golang压缩文件处理 gzip/zip包比较的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号