golang使用 gzip壓縮
這個例子中使用gzip壓縮格式,標准庫還支持zlib, bz2, flate, lzw
壓縮處理_三步:
1.創建壓縮文件
2.gzip write包裝
3.寫入數據
outputFile, _ := os.Create("G:/test.gz") gzipWriter := gzip.NewWriter(outputFile) //gzipWriter:需要操作的句柄
defer gzipWriter.Close() //寫入gizp writer數據時,它會依次壓縮數據並寫入到底層的文件中
gzipWriter.Write([]byte("hello world!\n")) log.Println("success")
解壓縮_三步:
1.打開壓縮文件
2.gzip Read包裝
3.往新文件copy
打開一個gzip文件,它的內容不是一個文件,而是一個內存流 gzipFile, _ := os.Open("G:/test.gz") gzipReader, _ := gzip.NewReader(gzipFile) defer gzipReader.Close() outfileWriter, err := os.Create("G:/unzipped.txt") if err != nil { log.Fatal(err) } defer outfileWriter.Close() // 復制內容
_, err = io.Copy(outfileWriter, gzipReader) if err != nil { log.Fatal(err) }
練習
package main import ( "bufio"
"compress/gzip"
"fmt"
"io"
"log"
"os"
"time" ) var ( gzipWriter *gzip.Writer file *os.File err error ) func init() { //初始化創建一個壓縮文件
outputFile, err := os.Create("G:/test.txt.gz") if err != nil { log.Fatal(err) } gzipWriter = gzip.NewWriter(outputFile) //打開普通文件
file, err = os.Open("G:/demo2.txt") if err != nil { panic(err) } } func main() { start := time.Now().UnixNano() //壓縮
compress() gzipWriter.Close() num := time.Now().UnixNano() fmt.Println("壓縮", num-start) //解壓縮
unCompress() end := time.Now().UnixNano() fmt.Println("解壓縮", end-num) } //讀取普通文件,寫入壓縮文件
func compress() { reader := bufio.NewReader(file) for { s, e := reader.ReadString('\n') if e == io.EOF { break } // 寫入gizp writer數據時,它會依次壓縮數據並寫入到底層的文件中。
_, err := gzipWriter.Write([]byte(s)) if err != nil { log.Fatal(err) } } } // 打開一個gzip文件,它的內容不是一個文件,而是一個內存流
func unCompress() { gzipFile, err := os.Open("G:/test.txt.gz") if err != nil { log.Fatal(err) } gzipReader, err := gzip.NewReader(gzipFile) if err == io.EOF { return } defer gzipReader.Close() //創建解壓后文件
outfileWriter, err := os.Create("G:/unzipped.txt") if err != nil { log.Fatal(err) } defer outfileWriter.Close() // copy 壓縮包數據copy到普通文件中
_, err = io.Copy(outfileWriter, gzipReader) if err != nil { log.Fatal(err) } }