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

来自 bytes.Reader 的 Golang un-gzip

来自 bytes.Reader 的 Golang un-gzip

Go
30秒到达战场 2022-01-17 10:25:35
我有一个文件结构,它包含一个主体,它只是一个*bytes.Reader我在结构上有两个方法Zip() error和UnZip() error. 当我调用Zip它时,它应该压缩将压缩数据存储在正文中的文件,并且我应该能够调用UnZip同一个文件并将解压缩的数据存储在正文中。我在操场上的最小示例如下。https://play.golang.org/p/WmZtqtvnyN我能够很好地压缩文件,看起来它正在做它应该做的事情;但是,当我尝试解压缩得到的文件时unexpected EOF我已经做了几个小时了。任何帮助是极大的赞赏。
查看完整描述

2 回答

?
慕容708150

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

我相信您应该在从底层缓冲区获取字节之前关闭 gzip 编写器。


func (f *File) Zip() error {

    buff := bytes.NewBuffer(nil)


    writer := gzip.NewWriter(buff)

    defer writer.Close()


    _, err := f.Body.WriteTo(writer)

    if err != nil {

        return err

    }


    writer.Close() // I have added this line


    f.Body = bytes.NewReader(buff.Bytes())

    f.Name = fmt.Sprintf("%s.gz", f.Name)

    return nil

}


查看完整回答
反对 回复 2022-01-17
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

根据文档gzip.NewReader_If r does not also implement io.ByteReader, the decompressor may read more data than necessary from r.

对于 bytes.ReaderA Reader implements the io.Reader, io.ReaderAt, io.WriterTo, io.Seeker, io.ByteScanner, and io.RuneScanner interfaces by reading from a byte slice.

问题可能在于bytes.Reader没有实现io.ByteReader


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

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