美文网首页go语言Go知识库
golang中compress/flate包

golang中compress/flate包

作者: ljh123 | 来源:发表于2018-12-06 21:37 被阅读0次

官方标准库对flate包的定义是:flate包实现了deflate压缩数据格式,参见RFC 1951。gzip包和zlib包实现了对基于deflate的文件格式的访问。

这边什么是deflate?
维基百科给出的解释是:DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。它最初是由菲尔·卡茨(Phil Katz)为他的PKZIP软件第二版所定义的,后来被RFC 1951标准化。

const (
    NoCompression = 0        // 不压缩
    BestSpeed          = 1        // 最快速度压缩
    BestCompression     = 9   // 最佳压缩比压缩
    DefaultCompression = -1  // 默认压缩
)

1)func NewReader(r io.Reader) io.ReadCloser

参数列表:r deflate压缩文件的文件标识符
返回值:解压后的ReadCloser数据
功能说明:从r读取deflate压缩数据,返回一个解压过的io.ReadCloser,使用后需要调用关闭该io.ReadCloser

demo:
package main

import (
    "bytes"
    "compress/flate"
    "log"
    "fmt"
    "io"
    "os"
)

func main() {
    // 一个缓存区压缩的内容
    buf := bytes.NewBuffer(nil)

    // 创建一个flate.Writer
    flateWrite, err := flate.NewWriter(buf, flate.BestCompression)
    if err != nil {
        log.Fatalln(err)
    }
    defer flateWrite.Close()
    // 写入待压缩内容
    flateWrite.Write([]byte("compress/flate\n"))
    flateWrite.Flush()
    fmt.Printf("压缩后的内容:%s\n", buf)

    // 解压刚压缩的内容
    flateReader := flate.NewReader(buf)
    defer flateWrite.Close()
    // 输出
    fmt.Print("解压后的内容:")
    io.Copy(os.Stdout, flateReader)
}

2)func NewReaderDict(r io.Reader, dict []byte) io.ReadCloser

参数列表:
    r deflate压缩的数据
    dict 解压数据时预设的字典,和NewWriteDict函数里得dict相同
返回值:解压后ReadCloser数据
功能说明:从r读取deflate压缩数据,使用预设得dict字典压缩数据,返回一个压缩过得io.ReadCloser,使用后需要调用者关闭该io.ReadCloser。主要用来读取NewWriteDict压缩的数据

demo:
package main

import (
    "bytes"
    "compress/flate"
    "log"
    "fmt"
    "io"
    "os"
)

func main() {
    // 一个缓冲区存储压缩的内容
    buf := bytes.NewBuffer(nil)

    // 创建一个flate.Write
    flateWrite, err := flate.NewWriterDict(buf, flate.BestCompression, []byte("key"))
    if err != nil {
        log.Fatalln(err)
    }
    defer flateWrite.Close()
    // 写入待压缩内容
    flateWrite.Write([]byte("compress/flate\n"))
    flateWrite.Flush()
    fmt.Println(buf)

    // 解压刚压缩的内容
    flateReader := flate.NewReaderDict(buf, []byte("key"))
    defer flateReader.Close()
    // 输出
    io.Copy(os.Stdout, flateReader)
}

3)func NewWrite(w io.Write, level int) (*Write, error)

参数列表:
1)w 表示输出数据的Write
2)level 表示压缩级别
返回列表:
1)*Write 基于压缩级别新生成的压缩数据的Writer
2)error 表示该函数的错误信息
功能说明:
    该函数返回一个压缩级别为level的新的压缩用的Writer,压缩级别的范围时1(BestSpeed)to 9(BestCompression)。压缩效果越好的意味着压缩速度越慢。0(NoCompression)表示不做任何压缩;仅仅只需要添加必要的deflate信息,-1(DefaultCompression)表示用默认的压缩级别。如果压缩级别在-1~9的范围内,error返回nil,否则将返回非nil的错误信息。

demo:
package main

import (
    "bytes"
    "compress/flate"
    "log"
    "fmt"
)

func main() {
    // 一个缓冲区压缩的内容
    buf := bytes.NewBuffer(nil)

    // 创建一个flate.Writer,压缩级别最好
    flateWrite, err := flate.NewWriter(buf, flate.BestCompression)
    if err != nil {
        log.Fatalln(err)
    }
    defer flateWrite.Close()
    // 写入待压缩内容
    flateWrite.Write([]byte("compress/flate\n"))
    flateWrite.Flush()
    fmt.Println(buf)
}

4)func NewWriteDict(w io.Writer, level int, dict []byte) (*Writer, error)

参数列表:
1)w 代表输出数据的Writer
2)level 代表压缩级别
3)dict 代表压缩预设字典
返回列表:
1)*Writer 基于压缩级别和预设字典新生成的压缩数据的Writer
2)error 该函数的错误信息
功能说明:
该函数和NewWriter差不多,只不过使用了预设字典进行初始化Writer。使用该Writer压缩的数据只能被使用相同字典初始化的Reader解压。可以实现基于密码的解压缩。

demo:
package main

import (
    "bytes"
    "compress/flate"
    "log"
    "fmt"
)

func main() {
    // 一个缓冲区存储压缩的内容
    buf := bytes.NewBuffer(nil)

    // 创建一个flate.Writer,压缩级别最好
    flateWriter, err := flate.NewWriterDict(buf, flate.BestCompression, []byte("key"))
    if err != nil {
        log.Fatalln(err)
    }
    defer flateWriter.Close()
    // 写入待压缩内容
    flateWriter.Write([]byte("compress/flate\n"))
    flateWriter.Flush()
    fmt.Println(buf)
}

5)func (e InternalError) Error() string

返回值:表示flate数据自身的错误信息
功能说明:InternalError其实是一个string,他实现了error接口,用于很方便的返回flate数据自身的错误信息

6)func (e *ReadError) Error() string

返回值:表示flate读取拷贝数据时的错误信息
功能说明:ReadError其实是一个struct,他实现了error接口,用于很方便的返回flate读取拷贝数据时的错误信息

7)func (e *WriteError) Error() string

返回值:表示flate输出数据的错误信息
功能说明:WriteError是一个struct,他实现了error接口,用于很方便的返回flate输出数据的错误信息

8)func (w *Writer) Close() error

返回值:返回一个error,没有错误时返回nil
功能说明:刷新缓冲并关闭w

9)func (w *Writer) Flush() error

返回值:返回一个error,没有错误时该error为nil
功能说明:Flush将缓存中的压缩数据刷新到下层的io.writer中。它主要用在压缩的网络协议中,目的时确保远程读取器有足够的数据重建一个数据包。Flush是阻塞的,直到缓冲中的数据都被写入到下层io.writer中才返回。如果下层io.writer返回一个error,那么Flush也会返回该error。
在zlib库的术语中,Flush等同于Z_SYNC_FLUSH。

9)func (w *Writer) Reset(dst io.Writer)

参数列表:
1)dst 重置时将为作w的下层io.Writer
功能说明:
Reset会丢弃现在w的状态,这相当于把dst、w的级别和字典作为参数,重新调用NewWriter或者NewWriterDict函数一样。

10)func (w *Writer) Write(data []byte) (n int, err error)

参数列表:
1)data 代表要写入的字节数据
返回值:
1)n 写入的字节数
2)err 错误信息,无错误返回nil
功能说明:
Write向w写入数据,最终会将压缩格数的数据写入到w的下层io.Writer中

非常好的一个资源链接:https://github.com/astaxie/gopkg/tree/master/compress/flate

如果有很好的资源,欢迎在评论区留言分享

相关文章

  • golang中compress/flate包

    官方标准库对flate包的定义是:flate包实现了deflate压缩数据格式,参见RFC 1951。gzip包和...

  • golang中compress/lzw包

    lzw包中提供压缩和解压两种操作函数列表: (1)压缩func NewWriter(w io.Writer, or...

  • Golang标准库——compress

    flate gzip bzip2 lzw zlib flate flate包实现了deflate压缩数据格式,参见...

  • golang中compress/gzip

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

  • golang中compress/bzip2

    一、bzip2的简介bzip2包实现bzip2的解压缩,bzip2是对单个文件进行压缩,可以先进行tar归档,然后...

  • golang中encoding/pem包

    1、golang中pem包是什么?2、golang中的pem包为我们开发者提供了哪些功能?3、我们可以用pem包做...

  • 006-golang中XML文件的处理

    golang中XML文件的处理 一.概述 在golang中 包"encoding/xml" 提供了对xml文件的...

  • golang中builtin包

    1、介绍builtin包中文官方标准库给出的介绍:builtin包为Go预声明标识符提供了文档。2、builtin...

  • golang中bufio包

    一、介绍go标准库中的bufio最近用golang写了一个处理文件的脚本,由于其中涉及到了文件读写,开始使用gol...

  • golang中bytes包

    golang标准库中提供了bytes包,该包几乎和strings包给string提供的功能,只不过bytes包对应...

网友评论

    本文标题:golang中compress/flate包

    本文链接:https://www.haomeiwen.com/subject/dhjacqtx.html