2016-06-01 5 views
0

私は体を保持するファイル構造体を持っています。*bytes.ReaderZip() errorUnZip() errorの2つのメソッドがあります。私はZipと呼ぶと、本体に圧縮データを格納しているファイルを圧縮する必要があります。同じファイルにUnZipを呼び出して、圧縮されていないデータを本体に格納できるはずです。Golang un-gzip from bytes.Reader

私が持っている最小の例は、以下のとおりです。 https://play.golang.org/p/WmZtqtvnyN

私はファイルをすばやく圧縮することができ、それが何をやっているかのように見えます。しかし、私がファイルを解凍しようとすると、私は得るunexpected EOF

私は今数時間これに行ってきました。どんな助けでも大歓迎です。

答えて

2

私は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 
} 
0

gzip.NewReaderためdocumentationbytes.Readerについては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.Readerio.ByteReaderを実装していないという事実にあります。

+0

io.ByteScannerもio.ByteReaderであるため、実際にはio.ByteReaderを実装しています。 –