为了账号安全,请及时绑定邮箱和手机立即绑定

bytes.Buffer 的限制?

bytes.Buffer 的限制?

Go
不负相思意 2021-07-01 13:04:08
我正在尝试使用“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
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

使用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))

}


查看完整回答
反对 回复 2021-07-05
  • 3 回答
  • 0 关注
  • 248 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信