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)
        }
    }
  • 相关阅读:
    集合的整理
    js中用tagname和id获取元素的3种方法
    浏览器的工作原理
    在浏览器中输入URL按下回车键后发生了什么
    浏览器内核、渲染引擎、js引擎
    浏览器的重绘、回流及网页优化
    SQL SERVER大话存储结构(1)
    SQL SERVER大话存储结构(2)
    SQL SERVER大话存储结构(3)
    基于binlog来分析mysql的行记录修改情况(python脚本分析)
  • 原文地址:https://www.cnblogs.com/quanting112037/p/10511337.html
Copyright © 2011-2022 走看看