golang中compress/flate

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

内容简介:官方标准库对flate包的定义是:flate包实现了deflate压缩数据格式,参见这边什么是deflate?维基百科给出的解释是:

官方标准库对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

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


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

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

Head First HTML5 Programming(中文版)

Head First HTML5 Programming(中文版)

埃里克•弗里曼 (Eric Freeman)、伊丽莎白•罗布森 (Elisabeth Robson) / 中国电力出版社 / 2012-9 / 78.00元

《Head First HTML5 Programming(中文版)》内容简介:你可能想创建具有动态性、交互性、包含丰富数据而且互连的Web页面。先等一下,Web页面?为什么不用HTML5创建成熟的Web应用呢?另外,为什么不使用现代技术,像在移动设备上一样轻松地应用到桌面浏览器呢?当然,你肯定希望使用最新的HTML5技术来完成,比如地理定位、视频、2D绘制、Web存储、Web工作线程等,是不是?......一起来看看 《Head First HTML5 Programming(中文版)》 这本书的介绍吧!

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

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具