【问题标题】:Golang un-gzip from bytes.Reader来自 bytes.Reader 的 Golang un-gzip
【发布时间】:2016-06-01 08:23:57
【问题描述】:

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

我在操场上的最小示例如下。 https://play.golang.org/p/WmZtqtvnyN

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

我已经做了好几个小时了。非常感谢任何帮助。

【问题讨论】:

    标签: go


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      根据documentation 对应gzip.NewReaderIf 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

      【讨论】:

      • 它确实实现了 io.ByteReader 因为 io.ByteScanner 也是一个 io.ByteReader。
      猜你喜欢
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 2015-02-22
      相关资源
      最近更新 更多