15

我想用 Go 从文件中读出一个块,把它当作一个stringgzip这个块。我知道如何从文件中读取并将其视为string,但是当涉及到compress/gzip时我迷路了。

我是否应该创建一个io.writer写入buf(字节片)的 ,用于gzip.NewWriter(io.writer)获取 aw *gzip.Writer然后用于w.Write(chunk_of_file)将文件块写入buf?然后我需要将字符串视为字节切片。

4

2 回答 2

32

你可以直接写 using gzip.Writeras 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.

于 2013-10-09T08:51:29.183 回答
0

如果结果没有返回到文件中,那么您可以直接使用 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)
}
于 2020-12-31T03:37:39.580 回答