使用golang 实现deflate、zlib压缩解压数据
在golang的官方标准库的compress目录下,有bzip2、flate、gzip、 lzw、 zlib包实现对应算法的数据压缩和解压,其中gzip包的一些使用上篇文章有写到,这篇文章给大家分享下deflate包、zlib包的使用
一、deflate压缩和解压数据
在deflate压缩的时候有个点需要注意一下,如果在没有被关闭的情况下,使用去读取缓冲区的内容,会报出一个的错误,但内容依旧可以被读取出来
//测试deflate
func TestCsFlate(t *testing.T) {
开始压缩
//创建buffer
buf := new(bytes.Buffer)
//根据创建buffer生成flate Writer,可以选择压缩模式,这里选择默认
flateWriter ,err := flate.NewWriter(buf,flate.DefaultCompression)
if err != nil {
t.Error(err.Error())
return
}
flateWriter.Close()
//使用flate Writer 向buffer写入压缩内容
flateWriter.Write([]byte("hello,golang"))
flateWriter.Flush()
解压内容
//根据刚才存有压缩内容的buffer获取flate Reader
flateReader := flate.NewReader(buf)
defer flateReader.Close()
//copy flate Reader中的内容
deBuffer := new(bytes.Buffer)
_,err = io.Copy(deBuffer,flateReader)
if err != nil {
t.Error(err.Error())
return
}
t.Log(deBuffer.String())
}
二、zlib格式压缩、解压
类似于deflate,在没有关闭的情况下,去读取缓冲区内容是读取不到的,所以不能使用defer去关闭Writer,这个坑当时浪费了我一些时间。
package main
import (
"bytes"
"compress/zlib"
"errors"
"io"
"io/ioutil"
"testing"
)
func TestCsZlib(t *testing.T) {
开始压缩
//创建buffer
buf := new(bytes.Buffer)
//根据创建的buffer生成 zlib writer
writer := zlib.NewWriter(buf)
//写入数据
_,err := writer.Write([]byte("hello, golang"))
if err != nil {
t.Error(err.Error())
return
}
writer.Close()
开始解压
reader, err := zlib.NewReader(buf)
if err != nil {
t.Error(err.Error())
return
}
defer reader.Close()
content ,err := ioutil.ReadAll(reader)
if err != nil && !errors.Is(err,io.ErrUnexpectedEOF){
t.Error(err.Error())
return
}
t.Log(string(content))
}