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) } }