golang中compress/gzip

栏目: Go · 发布时间: 5年前

内容简介:go标准库的gzip包中提供了两个操作,分别是压缩和解压常量和变量(1)压缩

go标准库的gzip包中提供了两个操作,分别是压缩和解压

常量和变量

const (
        NoCompression = flate.NoCompression // 不压缩
        BestSpeed = flate.BestSpeed // 最快速度
        BestCompression = flate.BestCompression // 最佳压缩比
        DefaultCompression = flate.DefaultCompression   // 默认压缩比
    )
    var (
        // 当读取gzip数据时发现无效的校验和时将返回该错误
        ErrChecksum = errors.New("gzip: invalid checksum")
        // 当读取gzip数据时发现无效的数据头时将返回该错误
        ErrHeader = errors.New("gzip: invalid header")
    )
    //数据头结构
    type Header struct {
        Comment string    // 文件注释
        Extra   []byte    // 附加数据
        ModTime time.Time // 文件修改时间
        Name    string    // 文件名
        OS      byte      // 操作系统类型
    }

(1)压缩

type Writer struct {}
功能说明:该结果主要用于将文件写入到gzip包中,并记录每个文件的数据头。另外要注意的是,NewWriter(0与NewWriterLevel()的主要区别在于前者使用默认的压缩级别,而后者可以指定自定义的压缩级别。单独操作gzip会比较麻烦,可以与tar一起使用,会比较方便。

demo

package main

import (
    "os"
    "log"
    "compress/gzip"
)

func main() {
    fw, err := os.Create("demo.gzip")   // 创建gzip包文件,返回*io.Writer
    if err != nil {
        log.Fatalln(err)
    }
    defer fw.Close()

    // 实例化心得gzip.Writer
    gw := gzip.NewWriter(fw)
    defer gw.Close()

    // 获取要打包的文件信息
    fr, err := os.Open("demo.txt")
    if err != nil {
        log.Fatalln(err)
    }
    defer fr.Close()

    // 获取文件头信息
    fi, err := fr.Stat()
    if err != nil {
        log.Fatalln(err)
    }

    // 创建gzip.Header
    gw.Header.Name = fi.Name()

    // 读取文件数据
    buf := make([]byte, fi.Size())
    _, err = fr.Read(buf)
    if err != nil {
        log.Fatalln(err)
    }

    // 写入数据到zip包
    _, err = gw.Write(buf)
    if err != nil {
        log.Fatalln(err)
    }
}

(2)解压

type Reader struct {}
功能说明:该结构主要用于读取gzip包的数据

demo

package main

import (
    "os"
    "log"
    "compress/gzip"
)

func main() {
    // 打开gzip文件
    fr, err := os.Open("demo.gzip")
    if err != nil {
        log.Fatalln(err)
    }
    defer fr.Close()

    // 创建gzip.Reader
    gr, err := gzip.NewReader(fr)
    if err != nil {
        log.Fatalln(err)
    }
    defer gr.Close()

    // 读取文件内容
    buf := make([]byte, 1024 * 1024 * 10)// 如果单独使用,需自己决定要读多少内容,根据官方文档的说法,你读出的内容可能超出你的所需(当你压缩gzip文件中有多个文件时,强烈建议直接和tar组合使用)
    n, err := gr.Read(buf)

    // 将包中的文件数据写入
    fw, err := os.Create(gr.Header.Name)
    if err != nil {
        log.Fatalln(err)
    }
    _, err = fw.Write(buf[:n])
    if err != nil {
        log.Fatalln(err)
    }
}

以上所述就是小编给大家介绍的《golang中compress/gzip》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Practical Vim, Second Edition

Practical Vim, Second Edition

Drew Neil / The Pragmatic Bookshelf / 2015-10-31 / USD 29.00

Vim is a fast and efficient text editor that will make you a faster and more efficient developer. It’s available on almost every OS, and if you master the techniques in this book, you’ll never need an......一起来看看 《Practical Vim, Second Edition》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具