我想用 Go 从文件中读出一个块,把它当作一个string
和gzip
这个块。我知道如何从文件中读取并将其视为string
,但是当涉及到compress/gzip
时我迷路了。
我是否应该创建一个io.writer
写入buf
(字节片)的 ,用于gzip.NewWriter(io.writer)
获取 aw *gzip.Writer
然后用于w.Write(chunk_of_file)
将文件块写入buf
?然后我需要将字符串视为字节切片。
你可以直接写 using gzip.Writer
as it implements io.Writer
。
例子:
package main
import (
"bytes"
"compress/gzip"
"fmt"
"log"
)
func main() {
var b bytes.Buffer
gz := gzip.NewWriter(&b)
if _, err := gz.Write([]byte("YourDataHere")); err != nil {
log.Fatal(err)
}
if err := gz.Close(); err != nil {
log.Fatal(err)
}
fmt.Println(b.Bytes())
}
如果您想设置压缩级别(默认为 -1 from compress/flate
),您可以使用gzip.NewWriterLevel
.
如果结果没有返回到文件中,那么您可以直接使用 Flate。您可以从 Gzip 中节省一些开销。另一种选择是 Brotli。例子:
package main
import (
"bytes"
"compress/flate"
"github.com/andybalholm/brotli"
)
func compressFlate(data []byte) ([]byte, error) {
var b bytes.Buffer
w, err := flate.NewWriter(&b, 9)
if err != nil {
return nil, err
}
w.Write(data)
w.Close()
return b.Bytes(), nil
}
func compressBrotli(data []byte) []byte {
var b bytes.Buffer
w := brotli.NewWriterLevel(&b, brotli.BestCompression)
w.Write(data)
w.Close()
return b.Bytes()
}
结果:
package main
import (
"bytes"
"fmt"
)
func main() {
data := bytes.Repeat([]byte("hello world"), 999_999)
f, err := compressFlate(data)
if err != nil {
panic(err)
}
b := compressBrotli(data)
fmt.Println(len(f) == 21379, len(b) == 40)
}