猿问

bytes.Buffer 的限制?

我正在尝试使用“compress/gzip”包对一段字节进行 gzip。我正在写入 bytes.Buffer 并且我正在写入 45976 字节,当我尝试使用 gzip.reader 和 reader 函数解压缩内容时 - 我发现并非所有内容都被恢复。bytes.buffer 有一些限制吗?这是绕过或改变它的一种方式吗?这是我的代码(编辑):


func compress_and_uncompress() {

    var buf bytes.Buffer

    w := gzip.NewWriter(&buf)

    i,err := w.Write([]byte(long_string))

    if(err!=nil){

            log.Fatal(err)

    }

    w.Close()


    b2 := make([]byte, 80000)

    r, _ := gzip.NewReader(&buf)

    j, err := r.Read(b2)

    if(err!=nil){

            log.Fatal(err)

    }

    r.Close()


    fmt.Println("Wrote:", i, "Read:", j)

}

测试的输出(选择字符串作为 long_string)将给出 Wrote: 45976, Read 32768


不负相思意
浏览 249回答 3
3回答

MYYA

使用ioutil.ReadAll。io.Reader 的合同说它不必返回所有数据,并且有一个很好的理由让它与内部缓冲区的大小无关。 ioutil.ReadAll像 io.Reader 一样工作,但会一直读到 EOF。例如(未经测试)import "io/ioutil"func compress_and_uncompress() {    var buf bytes.Buffer    w := gzip.NewWriter(&buf)    i,err := w.Write([]byte(long_string))    if err!=nil {            log.Fatal(err)    }    w.Close()    r, _ := gzip.NewReader(&buf)    b2, err := ioutil.ReadAll(r)    if err!=nil {            log.Fatal(err)    }    r.Close()    fmt.Println("Wrote:", i, "Read:", len(b2))}
随时随地看视频慕课网APP

相关分类

Go
我要回答