zoukankan      html  css  js  c++  java
  • 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!
    "))
        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('
    ')
            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)
        }
    }
  • 相关阅读:
    [Django]中间件
    Python装饰器的诞生过程-->和闭包的微妙关系
    Python实现经典算法之---斐波那契数列(兔子问题&走楼梯问题)
    二分查找---非递归算法和递归算法
    JavaScript的event对象
    input[type='submit']input[type='button']button等按钮在低版本的IE下面,去掉黑色边框的问题
    JavaScript 之 数据在内存中的存储和引用
    HTML5 之 简单汇总
    HTML5 Canvas——基础入门
    nodejs(14)express获取url中的参数
  • 原文地址:https://www.cnblogs.com/quanting112037/p/10511337.html
Copyright © 2011-2022 走看看