李长全

导航

golang使用 gzip压缩

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

 

posted on 2019-03-11 16:16  李长全  阅读(9656)  评论(0编辑  收藏  举报