资讯专栏INFORMATION COLUMN

Node.js学习之路18——压缩与解压

tigerZH / 3295人阅读

摘要:压缩与解压缩处理在中,可以使用模块进行压缩及解压缩处理创建各种用于压缩及解压缩的对象方法说明该方法创建并返回一个对象该对象使用算法对数据进行压缩处理该方法创建并返回一个对象该对象使用算法对数据进行压缩处理该方法创建并返回一个对象该对象使用算

压缩与解压缩处理

Node.js中,可以使用zlib模块进行压缩及解压缩处理.

1. 创建各种用于压缩及解压缩的对象
方法 说明
zlib.createGzip([options]) 该方法创建并返回一个Gzip对象,该对象使用Gzip算法对数据进行压缩处理
zlib.createDeflate([options]) 该方法创建并返回一个Deflate对象,该对象使用Deflate算法对数据进行压缩处理
zlib.createDeflateRaw([options]) 该方法创建并返回一个DeflateRaw对象,该对象使用DeflateRaw算法对数据进行压缩处理
zlib.createGunzip([options]) 该方法创建并返回一个Gunzip对象,该对象使用Gunzip算法对数据进行压缩处理
zlib.createInflate([options]) 该方法创建并返回一个Inflate对象,该对象使用Inflate算法对数据进行压缩处理
zlib.createInflateRaw([options]) 该方法创建并返回一个InflateRaw对象,该对象使用InflateRaw算法对数据进行压缩处理
zlib.createUnzip([options]) 该方法创建并返回一个Inflate对象,该对象使用Inflate算法对数据进行压缩处理,也可以对使用Deflate算法进行压缩的数据进行解压处理,根据压缩数据中的zlib头来判断该数据是使用哪一种算法进行压缩的数据

每个方法所创建的对象均为一个既可用于读取流数据的对象,又可以用于写入流数据的对象.

各个方法均采用一个可选的options参数,该参数为一个对象,用于指定压缩或者解压缩数据时所使用的选项.

flush: 用于设定或读取压缩方法及状态

zlib.Z_NO_FLUSH,flush的默认属性值,该模式运行在数据被输出之前,预先决定每次压缩多少数据,以实现最大化压缩.

zlib.Z_SYNC_FLUS,该属性值用于指定将压缩数据分为若干个压缩快,每次将一个压缩块中的数据写入输出缓存区,然后在数据块后面写入一个10位长度的空白数据块.当使用某些压缩算法时,这种模式可能会降低数据的压缩程序,因此只应该使用在必须使用的场合.

zlib.Z_FULL_FLUSH,与Z_SYNC_FLUSH相同,该属性值用于指定将压缩数据分为若干个压缩快,每次将一个压缩块中的数据写入输出缓存区,然后在数据块后面写入一个10位长度的空白数据块.但在数据块写完后复位压缩状态,因此,当压缩的数据流被管道输出时,解压缩该数据的另一端可以在前一次数据被破坏时`要求重新压缩.

zlib.Z_PARTIAL_FLUSH, 该属性值用于指定在压缩数据时每次都将输出缓存区所能容纳的数据写入输出缓存区,不限制输出数据的字节数.

zlib.Z_FINISH,当属性值为zlib.Z_FINISH时,输出缓存区中的剩余数据将被全部输出.

chunkSize: 用于设定将数据分块时每个块的大小,单位为字节,默认属性值为16*1024

windowBits: 该属性值以2位底数所求出的压缩窗口的对数,用于设定压缩窗口的大小,属性值在8-15之间,默认为15,属性值越大,压缩效果越好,但是内存消耗越多,当使用deflate算法压缩数据且在压缩数据中不使用zlib头时,属性值也可以为-15~-8的数值.

level: 该属性值为整数值,用于指定压缩级别,属性值可以为-10-9的数值.当属性值为0时,不执行压缩处理,当属性值为1时,压缩速度最快,压缩程度最低.当属性值为-1时,表示使用默认压缩比,该属性值自动打压缩速度和压缩程度之间进行妥协(大多数场合中妥协的结果相当于将level属性值设定为6)

memLevel: 该属性值用于指定在进行压缩时为压缩程序分配多少内存,属性值为1-9之间的证书,当该属性值为1时,消耗最少的内存,但是压缩程度被降低,当属性值为9时,消耗最多的内存,但是压缩效果最好,默认属性值为8.

strategy: 该属性值用于调整压缩算法

zlib.Z_DEFAULT_STARTEGY,该属性值为默认属性值,用于进行标准压缩.

zlib.Z_HUFFMAN_ONLY,该属性值用于指定在压缩数据时使用霍夫曼编码(Huffman Coding).霍夫曼编码是一种用于无损数据压缩的熵编码(又称为权编码)

zlib.Z_FILTERED,该属性值用于在压缩数据时对数据进行过滤,以达到更好的压缩效果

zlib.Z_RLE,该属性值用于指定在压缩时游程编码(Run-Length Encoding,RLE),游程编码又称行程长度编码,该编码对连读的黑白像素数(游程)以不同的码字进行编码,游程编码是一种简单的非破坏性资料压缩法,其好处是压缩和解压缩都非常快,其方法是计算连续出现的资料长度压缩,其缺点是对于不重复的资料反而加大容量,当对PNG图像进行压缩时,游程编码可以达到最佳的压缩效果.

zlib.Z_FIXED,该属性值用于指定在压缩过程中禁止使用霍夫曼编码,以达到在特殊的应用程序中简化解码过程的目的.

由于Gzip对象,Deflate对象与DeflateRaw对象既可以用于读取流数据,又可以用于写入流数据,因此,可以直接使用这些ReadStream对象的pipe方法将文件流数据输出到Gzip对象,Deflate对象与DeflateRaw对象中,再使用这些对象的pipe方法将使用这些对象进行压缩后的流数据输出到另一个压缩文件中.

使用Gzip对象压缩文件

const zlib = require("zlib");
const fs = require("fs");
let gzip = zlib.createGzip();
let inp = fs.createReadStream("file.txt");
let out = fs.createWriteStream("file.txt.gz");
inp.pipe(gzip).pipe(out);

由于Gunzip对象,Inflate对象,InflateRaw对象与Unzip对象既可以读取流数据,又可以用于写入流数据。因此,可以直接使用这些ReadStream对象的pipe方法读取压缩文件中的数据并将其输出到Gunzip对象,Inflate对象,InflateRaw对象或Unzip对象中,再使用这些对象的pipe方法将使用这些对象进行解压缩后的流数据还原到一个文件中.

使用Gunzip对象解压缩文件

const zlib = require("zlib");
const fs =require("fs");
let gunzip = zlib.createGunzip();
let inp = fs.createReadStream("./file.txt.gz");
let out = fs.createWriteStream("file.txt");
inp.pipe(gunzip).pipe(out);

HTTP服务器端与HTTP客户端之间传输压缩数据时,在客户端请求头中需要使用accept-encoding字段指定服务器端压缩数据时使用的压缩算法,在服务器端响应头中应使用content-encoding字段声明服务器端响应数据的压缩算法.

2. zlib模块中的各种方法

zlib模块中,除了各种用于创建对数据进行压缩及解压缩处理的方法之外,还提供了很多的方法,所有这些方法的第一个参数值均为一个字符串或一个Buffer对象,在防范内部对该字符串或Buffer对象所引用的缓存区中的数据进行压缩或解压缩.在这些方法中不使用options参数,所有这些方法的第二个参数值均为一个回调函数,用于指定压缩或解压缩数据结束时需要执行的处理,该回调函数中的第一个参数值为压缩或解压缩数据失败时触发的错误对象,该回调函数中的第二个参数值为一个Buffer对象,该Buffer对象为所引用的缓存区中存放了压缩或解压缩后的数据.
各种用于压缩或解压缩数据的方法

方法 说明
zlib.zgip(buf, callback(err, buf){..}) 使用Gzip算法压缩buf字符串或buf缓存区中的数据
zlib.deflate(buf, callback(err, buf){..}) 使用Deflate算法压缩buf字符串或buf缓存区中的数据
zlib.deflateRaw(buf, callback(err, buf){..}) 使用Deflate算法压缩buf字符串或buf缓存区中的数据,在压缩数据中不添加zlib
zlib.gunzip(buf, callback(err, buf){..}) 使用Gunzip算法压缩buf字符串或buf缓存区中的数据
zlib.inflate(buf, callback(err, buf){..}) 使用Inflate算法压缩buf字符串或buf缓存区中的数据
zlib.inflateRaw(buf, callback(err, buf){..}) 使用inflateRaw算法压缩buf字符串或buf缓存区中的数据,在压缩数据中不添加zlib
zlib.unzip(buf, callback(err, buf){..}) 该方法可使用Gunzip算法解压缩buf缓存区中的数据,又可使用Inflate算法解压缩buf缓存区中的数据,根据压缩数据中的zlib头来判断使用哪一种算法解压缩数据

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92995.html

相关文章

  • Node.js学习之路02——常用的Console对象的属性

    摘要:常用的对象的属性和浏览器环境和环境下都可以正常输出,功能类似和普通的分类输出,如果参数不为错误那么浏览器端发出警告信息和错误内容那么环境下输出的是普通正常内容环境下报错前端,可以使用的插件,在需要的地方,直接输入就可以停在这里后端,直接使用 常用的Console对象的属性 1. console.log()和console.info() 浏览器环境和Node环境下都可以正常输出,功能类...

    elina 评论0 收藏0
  • Node.js学习之路06——fs文件系统之目录操作文件信息

    6. 目录操作 6.1 创建目录 如果存在该目录,就创建失败 同步创建目录fs.mkdirSync(path, [mode]) const fs = require(fs); let mkdir = ./mkdir; fs.mkdir(mkdir, (err) => { if (err) { console.log(`mkdir ${mkdir} file faile...

    用户83 评论0 收藏0
  • vue+node项目部署上线

    摘要:在线地址现在新用户购买阿里云服务器年只要啦。。开放端口登陆阿里云,进入控制管理台云服务器安全组配置规则快速创建规则启动服务浏览器打开服务器如,如无意外,即正常运行访问啦。 在线地址: cl8023.com github 现在新用户购买阿里云服务器 3年只要398啦。。https://m.aliyun.com/act/team... 云服务器 阿里云 or 腾讯云 阿里云服务器品牌:...

    Alliot 评论0 收藏0
  • Node.js学习之路08——fs文件系统之stream流的基本介绍

    摘要:中各种用于读取数据的对象对象描述用于读取文件代表客户端请求或服务器端响应代表一个端口对象用于创建子进程的标准输出流。如果子进程和父进程共享输入输出流,则子进程的标准输出流被废弃用于创建子进程的标准错误输出流。 9. stream流 fs模块中集中文件读写方法的区别 用途 使用异步方式 使用同步方式 将文件完整读入缓存区 readFile readFileSync 将文件部...

    BoYang 评论0 收藏0
  • Node.js学习之路01——不同操作系统下Node.js环境搭建

    摘要:基本介绍这是一个基本的环境搭建不同的操作系统可以选择不同的安装方式如果不需要太多的安装步骤就直接在官网下载最新版安装包进行安装即可环境配置必须安装的软件更改源与更新系统首先备份下载的源配置文件运行生成缓存更新系统安装使用安装命 基本介绍 这是一个基本的Node.js环境搭建,不同的操作系统可以选择不同的安装方式 如果不需要太多的安装步骤,就直接在Node.js官网下载最新版安装包进行...

    meteor199 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<