我想使用go从file
中读取一个块,将其视为string
和gzip
此块。我知道如何阅读file
并将其视为string
,但当谈到"compress/gzip"
时,我迷失了。我应该创建一个io.writer
,写入buf
(字节切片),使用gzip.Writer(io.writer)
获取指向io.writer
的编写器指针,然后使用{{ 1}}将gzip.Write(chunk_of_file)
写入chunk_of_file
?那么我需要将字符串视为字节切片..
答案 0 :(得分:19)
您可以使用gzip.Writer
进行编写,因为它实现了io.Writer
。
示例:
package main
import (
"bytes"
"compress/gzip"
"fmt"
)
func main() {
var b bytes.Buffer
gz := gzip.NewWriter(&b)
if _, err := gz.Write([]byte("YourDataHere")); err != nil {
panic(err)
}
if err := gz.Flush(); err != nil {
panic(err)
}
if err := gz.Close(); err != nil {
panic(err)
}
fmt.Println(b)
}
如果您想设置压缩级别(默认为"-1" from compress/flate
),您可以使用gzip.NewWriterLevel
。
答案 1 :(得分:0)
如果结果没有返回到文件中,那么您可以使用 Flate 直接:
package main
import (
"bytes"
"compress/flate"
"compress/gzip"
)
func main() {
b := bytes.Repeat([]byte("south north"), 999_999)
{ // gzip
buf := new(bytes.Buffer)
w := gzip.NewWriter(buf)
w.Write(b)
w.Close()
println(buf.Len() == 21395)
}
{ // flate
buf := new(bytes.Buffer)
w, e := flate.NewWriter(buf, -1)
if e != nil {
panic(e)
}
w.Write(b)
w.Close()
println(buf.Len() == 21377)
}
}
它并不多,但是您从 Gzip 中节省了 18 个字节的开销。