2013-10-05 50 views
7

我想用go從file中讀出一個塊,將其視爲stringgzip這個塊。我知道如何從file中讀取並將其當作string,但是當涉及到"compress/gzip"時,我迷了路。我應該創建一個寫入buf(字節片段)的io.writer,使用gzip.Writer(io.writer)獲取指向io.writer的寫入器指針,然後使用gzip.Write(chunk_of_file)chunk_of_file寫入buf?那麼我需要將字符串視爲一個字節切片。如何在golang中的字符串上使用gzip?

+0

可能的重複[如何使用golang的「compress/gzip」軟件包來gzip文件?](http://stackoverflow.com/questions/16890648/how-can-i-use-golangs-compress-gzip -package-to-gzip-a-file) –

+0

我很困惑你的問題,在一個字符串*是* a []字節,所以如果你想它是一個,只要將它轉換爲[]字節(mystringvar ) – mzimmerman

回答

16

您可以使用gzip.Writer來編寫,因爲它實現了io.Writer

例子:

package main 

import (
    "bytes" 
    "compress/gzip" 
    "fmt" 
) 

func main() { 
    var b bytes.Buffer 
    gz := gzip.NewWriter(&b) 
    if _, err := gz.Write([]byte("YourDataHere")); err != nil { 
     panic(err) 
    } 
    if err := gz.Flush(); err != nil { 
     panic(err) 
    } 
    if err := gz.Close(); err != nil { 
     panic(err) 
    } 
    fmt.Println(b) 
} 

Playground

如果你想設置的壓縮級別(默認爲"-1" from compress/flate),可以使用gzip.NewWriterLevel

+0

我覺得應該指出Writer實際上不會將壓縮字節寫入緩衝區,直到調用gz.Flush()。 flush也是用'gz.Close()'調用的,但是這個操場例子從來沒有那麼遠。 – Nenoco

+0

@Nenoco你是對的。我已經添加了'Flush'語句。 – Intermernet

+1

還有一件事是Flush()只將_current_數據寫入緩衝區。它沒有完成整個GZIP格式。所以,在這種情況下,這是非常沒用的,因爲寫在最後一行的內容不是有效的GZIP結構。你需要調用Close()_before_你對緩衝區做任何事情。 –

相關問題