我有一个文件结构,它保存了一个只是一个*bytes.Reader
我在结构Zip() error
和UnZip() 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
。