Golang un-gzip from bytes.Reader



我有一个文件结构,它保存了一个只是一个*bytes.Reader我在结构Zip() errorUnZip() error上有两种方法。 当我调用Zip时,它应该压缩将压缩数据存储在正文中的文件,并且我应该能够对同一文件调用UnZip并将解压缩数据存储在正文中。

我举的最小例子是下面在操场上。https://play.golang.org/p/WmZtqtvnyN

我能够很好地压缩文件,

看起来它正在做它应该做的事情;但是,当我尝试解压缩文件时,我得到了unexpected EOF

我已经做了几个小时了。任何帮助将不胜感激。

我相信

你应该在从底层缓冲区获取字节之前关闭 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
}

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

对于字节。读者,A 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

最新更新