XuLaLa.Tech

首页客户端下载Windows 使用V2Ray 教程SSR 教程Clash 教程

Golang gzipwriter如何获取压缩后的尺寸?

2025.04.09
在Go语言中,使用gzip.Writer对数据进行压缩时,获取压缩后的数据大小并非直接可行,因为gzip.Writer会将压缩数据流式地写入底层io.Writer,并在调用Close方法时完成压缩过程。因此,在压缩完成之前,无法准确得知最终的压缩数据大小。

要获取压缩后的数据大小,可以采用以下方法:

方法一:bytes.Buffer

使用bytes.Buffer作为底层io.Writer:在内存中存储压缩数据,压缩完成后,通过调用BufferLen方法获取数据大小。
   package main
import (
"bytes"
"compress/gzip"
"fmt"
)
func main() {
var buf bytes.Buffer
writer := gzip.NewWriter(&buf)
data := []byte("需要压缩的原始数据")
_, err := writer.Write(data)
if err != nil {
// 处理写入错误
fmt.Println("写入错误:", err)
return
}
// 关闭gzip.Writer以完成压缩过程
err = writer.Close()
if err != nil {
// 处理关闭错误
fmt.Println("关闭错误:", err)
return
}
// 获取压缩后的数据大小
compressedSize := buf.Len()
fmt.Printf("压缩后的数据大小: %d 字节\n", compressedSize)
}
在上述代码中,bytes.Buffer用于存储压缩后的数据。调用writer.Close()完成压缩过程后,使用buf.Len()获取压缩数据的大小。

方法二:io.Writer

自定义io.Writer以统计写入的字节数:如果不希望将压缩数据存储在内存中,可以实现一个自定义的io.Writer,在写入过程中统计字节数。
   package main
import (
"compress/gzip"
"fmt"
"io"
)
// 定义计数器Writer
type countingWriter struct {
w     io.Writer
count int
}
// 实现Write方法
func (cw *countingWriter) Write(p []byte) (int, error) {
n, err := cw.w.Write(p)
cw.count += n
return n, err
}
func main() {
// 示例底层Writer,可以是文件或网络连接
var underlyingWriter io.Writer = &bytes.Buffer{}
// 包装计数器Writer
cw := &countingWriter{w: underlyingWriter}
// 创建gzip.Writer
writer := gzip.NewWriter(cw)
data := []byte("需要压缩的原始数据")
_, err := writer.Write(data)
if err != nil {
// 处理写入错误
fmt.Println("写入错误:", err)
return
}
// 关闭gzip.Writer以完成压缩过程
err = writer.Close()
if err != nil {
// 处理关闭错误
fmt.Println("关闭错误:", err)
return
}
// 获取压缩后的数据大小
compressedSize := cw.count
fmt.Printf("压缩后的数据大小: %d 字节\n", compressedSize)
}
在此示例中,countingWriter包装了实际的io.Writer,并在每次写入时累加写入的字节数。完成压缩后,cw.count即为压缩数据的大小。需要注意的是,在流式压缩过程中,只有在调用gzip.WriterClose方法后,才能确保所有数据都已被写入底层io.Writer,从而准确获取压缩后的数据大小。
© 2010-2022 XuLaLa 保留所有权利 本站由 WordPress 强力驱动
请求次数:69 次,加载用时:0.665 秒,内存占用:32.19 MB