使用golang 实现deflate、zlib压缩解压数据

使用golang 实现deflate、zlib压缩解压数据

在golang的官方标准库的compress目录下,有bzip2、flate、gzip、 lzw、 zlib包实现对应算法的数据压缩和解压,其中gzip包的一些使用上篇文章有写到,这篇文章给大家分享下deflate包、zlib包的使用

一、deflate压缩和解压数据

在deflate压缩的时候有个点需要注意一下,如果flate.Writer在没有被关闭的情况下,使用flate.Reader去读取缓冲区的内容,会报出一个io.ErrUnexpectedEOF的错误,但内容依旧可以被读取出来


//测试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,zlib.Writer在没有关闭的情况下,去读取缓冲区内容是读取不到的,所以不能使用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))
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值