golang中compress/flate
官方標準庫對flate包的定義是:flate包實現了deflate壓縮資料格式,參見ofollow,noindex">RFC 1951 。gzip包和zlib包實現了對基於deflate的檔案格式的訪問。
這邊什麼是deflate?
維基百科給出的解釋是:DEFLATE 是同時使用了LZ77 演算法與哈夫曼編碼 (Huffman Coding)的一個無損資料壓縮 演算法 。它最初是由菲爾·卡茨 (Phil Katz)為他的PKZIP 軟體第二版所定義的,後來被RFC 1951 標準化。
const ( NoCompression = 0// 不壓縮 BestSpeed= 1// 最快速度壓縮 BestCompression= 9// 最佳壓縮比壓縮 DefaultCompression = -1// 預設壓縮 )
1)func NewReader(r io.Reader) io.ReadCloser
引數列表:r deflate壓縮檔案的檔案識別符號 返回值:解壓後的ReadCloser資料 功能說明:從r讀取deflate壓縮資料,返回一個解壓過的io.ReadCloser,使用後需要呼叫關閉該io.ReadCloser demo: package main import ( "bytes" "compress/flate" "log" "fmt" "io" "os" ) func main() { // 一個快取區壓縮的內容 buf := bytes.NewBuffer(nil) // 建立一個flate.Writer flateWrite, err := flate.NewWriter(buf, flate.BestCompression) if err != nil { log.Fatalln(err) } defer flateWrite.Close() // 寫入待壓縮內容 flateWrite.Write([]byte("compress/flate\n")) flateWrite.Flush() fmt.Printf("壓縮後的內容:%s\n", buf) // 解壓剛壓縮的內容 flateReader := flate.NewReader(buf) defer flateWrite.Close() // 輸出 fmt.Print("解壓後的內容:") io.Copy(os.Stdout, flateReader) }
2)func NewReaderDict(r io.Reader, dict []byte) io.ReadCloser
引數列表: r deflate壓縮的資料 dict 解壓資料時預設的字典,和NewWriteDict函式裡得dict相同 返回值:解壓後ReadCloser資料 功能說明:從r讀取deflate壓縮資料,使用預設得dict字典壓縮資料,返回一個壓縮過得io.ReadCloser,使用後需要呼叫者關閉該io.ReadCloser。主要用來讀取NewWriteDict壓縮的資料 demo: package main import ( "bytes" "compress/flate" "log" "fmt" "io" "os" ) func main() { // 一個緩衝區儲存壓縮的內容 buf := bytes.NewBuffer(nil) // 建立一個flate.Write flateWrite, err := flate.NewWriterDict(buf, flate.BestCompression, []byte("key")) if err != nil { log.Fatalln(err) } defer flateWrite.Close() // 寫入待壓縮內容 flateWrite.Write([]byte("compress/flate\n")) flateWrite.Flush() fmt.Println(buf) // 解壓剛壓縮的內容 flateReader := flate.NewReaderDict(buf, []byte("key")) defer flateReader.Close() // 輸出 io.Copy(os.Stdout, flateReader) }
3)func NewWrite(w io.Write, level int) (*Write, error)
引數列表: 1)w 表示輸出資料的Write 2)level 表示壓縮級別 返回列表: 1)*Write 基於壓縮級別新生成的壓縮資料的Writer 2)error 表示該函式的錯誤資訊 功能說明: 該函式返回一個壓縮級別為level的新的壓縮用的Writer,壓縮級別的範圍時1(BestSpeed)to 9(BestCompression)。壓縮效果越好的意味著壓縮速度越慢。0(NoCompression)表示不做任何壓縮;僅僅只需要新增必要的deflate資訊,-1(DefaultCompression)表示用預設的壓縮級別。如果壓縮級別在-1~9的範圍內,error返回nil,否則將返回非nil的錯誤資訊。 demo: package main import ( "bytes" "compress/flate" "log" "fmt" ) func main() { // 一個緩衝區壓縮的內容 buf := bytes.NewBuffer(nil) // 建立一個flate.Writer,壓縮級別最好 flateWrite, err := flate.NewWriter(buf, flate.BestCompression) if err != nil { log.Fatalln(err) } defer flateWrite.Close() // 寫入待壓縮內容 flateWrite.Write([]byte("compress/flate\n")) flateWrite.Flush() fmt.Println(buf) }
4)func NewWriteDict(w io.Writer, level int, dict []byte) (*Writer, error)
引數列表: 1)w 代表輸出資料的Writer 2)level 代表壓縮級別 3)dict 代表壓縮預設字典 返回列表: 1)*Writer 基於壓縮級別和預設字典新生成的壓縮資料的Writer 2)error 該函式的錯誤資訊 功能說明: 該函式和NewWriter差不多,只不過使用了預設字典進行初始化Writer。使用該Writer壓縮的資料只能被使用相同字典初始化的Reader解壓。可以實現基於密碼的解壓縮。 demo: package main import ( "bytes" "compress/flate" "log" "fmt" ) func main() { // 一個緩衝區儲存壓縮的內容 buf := bytes.NewBuffer(nil) // 建立一個flate.Writer,壓縮級別最好 flateWriter, err := flate.NewWriterDict(buf, flate.BestCompression, []byte("key")) if err != nil { log.Fatalln(err) } defer flateWriter.Close() // 寫入待壓縮內容 flateWriter.Write([]byte("compress/flate\n")) flateWriter.Flush() fmt.Println(buf) }
5)func (e InternalError) Error() string
返回值:表示flate資料自身的錯誤資訊 功能說明:InternalError其實是一個string,他實現了error介面,用於很方便的返回flate資料自身的錯誤資訊
6)func (e *ReadError) Error() string
返回值:表示flate讀取拷貝資料時的錯誤資訊 功能說明:ReadError其實是一個struct,他實現了error介面,用於很方便的返回flate讀取拷貝資料時的錯誤資訊
7)func (e *WriteError) Error() string
返回值:表示flate輸出資料的錯誤資訊 功能說明:WriteError是一個struct,他實現了error介面,用於很方便的返回flate輸出資料的錯誤資訊
8)func (w *Writer) Close() error
返回值:返回一個error,沒有錯誤時返回nil 功能說明:重新整理緩衝並關閉w
9)func (w *Writer) Flush() error
返回值:返回一個error,沒有錯誤時該error為nil 功能說明:Flush將快取中的壓縮資料重新整理到下層的io.writer中。它主要用在壓縮的網路協議中,目的時確保遠端讀取器有足夠的資料重建一個數據包。Flush是阻塞的,直到緩衝中的資料都被寫入到下層io.writer中才返回。如果下層io.writer返回一個error,那麼Flush也會返回該error。 在zlib庫的術語中,Flush等同於Z_SYNC_FLUSH。
9)func (w *Writer) Reset(dst io.Writer)
引數列表: 1)dst 重置時將為作w的下層io.Writer 功能說明: Reset會丟棄現在w的狀態,這相當於把dst、w的級別和字典作為引數,重新呼叫NewWriter或者NewWriterDict函式一樣。
10)func (w *Writer) Write(data []byte) (n int, err error)
引數列表: 1)data 代表要寫入的位元組資料 返回值: 1)n 寫入的位元組數 2)err 錯誤資訊,無錯誤返回nil 功能說明: Write向w寫入資料,最終會將壓縮格數的資料寫入到w的下層io.Writer中
非常好的一個資源連結:https://github.com/astaxie/gopkg/tree/master/compress/flate
如果有很好的資源,歡迎在評論區留言分享