Node.js——zlib压缩模块

张开发
2026/4/10 21:06:19 15 分钟阅读

分享文章

Node.js——zlib压缩模块
zlib压缩模块1、创建压缩及解压缩的对象1.1、压缩文件1.2、解压文件1.3、压缩/解压网络数据流2、zlib模块中的各种方法1、创建压缩及解压缩的对象在zlib模块中提供表中的几个方法用于创建各种对数据进行压缩及解压缩处理的对象。方法说明zlib.createGzip [options])该方法创建并返回一个Gzip对象该对象使用Gzip算法对数据进行压缩处理zlib.createDeflate ([options])该方法创建并返回一个Deflate对象该对象使用Deflate算法对数据进行压缩处理zlib.createDeflateRaw [options])该方法创建并返回一个DeflateRaw对象该对象使用Deflate算法对数据进行压缩处理。在压缩数据中不添加zlib头zlib.createGunzip [options])该方法创建并返回一个Gunzip对象该对象对使用Gzip算法进行压缩的数据进行解压缩处理zlib.createInflate [options])该方法创建并返回一个Inflate对象该对象对使用Deflate对象进行压缩的数据进行解压缩处理zlib.createInflateRaw ([options])该方法创建并返回一个InflateRaw对象该对象对使用DeflateRaw对象进行压缩的数据进行解压缩处理zlib.createUnzip [options]该方法创建并返回一个Unzip对象该对象既可对使用Gzip算法进行压缩的数据进行解压缩处理也可对使用Deflate算法进行压缩的数据进行解压缩处理。根据压缩数据中的zb头来判断该数据是使用哪一种算法进行压缩的数据上表描述的各个方法均采用一个可选的options参数该参数值为一个对象用于指定压缩或解压缩数据时所使用的选项。该对象可以使用的属性及属性值如下所示有些属性只用于压缩数据时​。flush用于设定或读取压缩方法及状态可指定属性值如下。zlib.Z_NO_FLUSHflush属性的默认属性值该模式运行在数据被输出之前预先决定每次压缩多少数据以实现最大化压缩。zlib.Z_SYNC_FLUSH该属性值用于指定将压缩数据分为若干个压缩块每次将一个压缩块中的数据写入输出缓存区然后在数据块后面写入一个10位长度的空白数据块。当使用某些压缩算法时这种模式可能会降低数据的压缩程度因此只应该使用在必须使用的场合。zlib.Z_PARTIAL_FLUSH该属性值用于指定在压缩数据时每次都将输出缓存区所能容纳的数据写入输出缓存区不限制输出数据的字节数。zlib.Z_FULL_FLUSH与Z_SYNC_FLUSH相同预先将压缩数据分为若干个压缩块然后在数据块后面写入一个10位长度的空白数据块。但是在数据块写完后复位压缩状态因此当压缩的数据流被管道输出时解压缩该数据的另一端可以在前次数据被破坏时要求重新压缩。zlib.Z_FINISH当属性值为zlib.Z_FINISH时输出缓存区中的剩余数据将被全部输出。chunkSize用于设定将数据分块时每个块的大小单位为字节默认属性值为16*1024。windowBits该属性值为以2为底数所求出的压缩窗口的对数用于设定压缩窗口的大小属性值在815之间默认为15。属性值越大压缩效果越好但是内存消耗也越多。当使用deflate算法压缩数据且在压缩数据中不使用zlib头时属性值也可以为-15-8的数值。level该属性值为整数值用于指定压缩级别属性值可以为-1或09的数值。当属性值为0时不执行压缩处理。当属性值为1时压缩速度最快压缩程度最低。当属性值为9时压缩速度最慢压缩程度最高。当属性值为-1时表示使用默认压缩比该属性值自动在压缩速度及压缩程度之间进行妥协大多数场合中妥协结果相当于将level属性值设定为6​。memLevel该属性值用于指定在进行压缩时为压缩程序分配多少内存属性值为19之间的整数。当该属性值为1时消耗最少的内存但是压缩程度被降低。当该属性值为9时消耗最多的内存但是压缩效果最好。默认属性值为8。strategy该属性值用于调整压缩算法可指定属性值如下。zlib.Z_DEFAULT_STRATEGY该属性值为默认属性值用于进行标准压缩。zlib.Z_HUFFMAN_ONLY该属性值用于指定在压缩数据时使用霍夫曼编码Huffman Coding​。霍夫曼编码是一种用于无损数据压缩的熵编码又称权编码算法。zlib.Z_FILTERED该属性值用于在压缩数据时对数据进行过滤以达到更好的压缩效果。zlib.Z_RLE该属性值用于指定在压缩时采用游程编码Run-Length EncodingRLE​。游程编码又称行程长度编码该编码对连续的黑、白像素数游程以不同的码字进行编码。游程编码是一种简单的非破坏性资料压缩法其好处是压缩和解压缩都非常快。其方法是计算连续出现的资料长度压缩之其缺点是对于不重复的资料反而加大容量。当对PNG图像进行压缩时游程编码可以达到最佳的压缩效果。zlib.Z_FIXED该属性值用于指定在压缩过程中禁止使用霍夫曼编码以达到在特殊的应用程序中简化解码过程的目的。1.1、压缩文件由于Gzip对象、Deflate对象与DeflateRaw对象既可用于读取流数据又可用于写入流数据因此我们可以直接使用这些ReadStream对象的pipe方法将文件流数据输出到Gzip对象、Deflate对象与DeflateRaw对象中再使用这些对象的pipe方法将使用这些对象进行压缩后的流数据输出到另一个压缩文件中。在zlib模块中上表中描述的各方法所创建的对象均为一个既可用于读取流数据的对象又可用于写入流数据的对象拥有表1及表2中描述的各种事件拥有表3及表4中描述的各种方法。表1读取事件表2写入事件表3读取方法表4写入方法示例方法创建一个Gzip对象然后为应用程序根目录下的aaa.txt文件创建一个ReadStream对象使用该对象来读取aaa.txt文件中的数据为应用程序根目录下的aaa.txt.gz文件创建一个WriteStream对象然后使用ReadStream对象的pipe方法读取aaa.txt文件中的数据并将它输出到Gzip对象中进行压缩然后使用Gzip对象的pipe方法将压缩后的数据输出到WriteStream对象即aaa.txt.gz文件中。constzlibrequire(zlib);letgzipzlib.createGzip();constfsrequire(fs);letinpfs.createReadStream(aaa.txt);letoutfs.createWriteStream(aaa.txt.gz);inp.pipe(gzip).pipe(out);1.2、解压文件由于Gunzip对象、Inflate对象、InflateRaw对象与Unzip对象既可用于读取流数据又可用于写入流数据因此可以直接使用这些ReadStream对象的pipe方法读取压缩文件中的数据并将其输出到Gunzip对象、Inflate对象、InflateRaw对象或Unzip对象中再使用这些对象的pipe方法将使用这些对象进行解压缩后的流数据还原到一个文件中。示例首先使用createGunzip方法创建一个Gunzip对象然后为应用程序根目录下的aaa.txt.gz文件创建一个ReadStream对象使用该对象来读取aaa.txt.gz文件中的数据为应用程序根目录下的bbb.txt文件创建一个WriteStream对象然后使用ReadStream对象的pipe方法读取aaa.txt.gz文件中的数据并将它输出到Gunzip对象中进行解压缩接着使用Gunzip对象的pipe方法将解压缩后的数据输出到WriteStream对象即bbb.txt文件中。constzlibrequire(zlib);constgunzipzlib.createGunzip();constfsrequire(fs);letinpfs.createReadStream(aaa.txt.gz);letoutfs.createWriteStream(bbb.txt);inp.pipe(gunzip).pipe(out);1.3、压缩/解压网络数据流在HTTP服务器端与HTTP客户端之间传输压缩数据时在客户端请求头中需要使用accept-encoding字段指定服务器端压缩数据时使用的压缩算法在服务器端响应头中应使用content-encoding字段声明服务器端响应数据的压缩算法。下面开始创建HTTP服务器代码在该示例代码中先创建一个HTTP服务器当HTTP服务器接收到客户端请求时获取客户端请求头中的accept-encoding字段如果字段值中包含“deflate”字符串创建Deflate对象并使用该对象压缩应用程序根目录下的aaa.txt文件在服务器端响应头中将content-encoding字段值指定为“deflate”​然后将压缩后的数据返回给客户端如果accept-encoding字段值中包含“gzip”字符串创建Gzip对象并使用该对象压缩应用程序根目录下的aaa.txt文件在服务器端响应头中将content-encoding字段值指定为“gzip”​然后将压缩后的数据返回给客户端如果accept-encoding字段值中既不包含“deflate”字符串又不包含“gzip”字符串直接将应用程序根目录下的aaa.txt文件中的数据返回给客户端。constzlibrequire(zlib);consthttprequire(http);constfsrequire(fs);//创建HTTP服务端http.createServer((request,response){letrawfs.createReadStream(aaa.txt);//获取headerletacceptEncodingrequest.headers[accept-encoding];//判断压缩算法if(!acceptEncoding){acceptEncoding;}if(acceptEncoding.match(/\bdeflate\b/)){response.writeHead(200,{content-encoding:deflate});raw.pipe(zlib.createDeflate()).pipe(response);}elseif(acceptEncoding.match(/\bgzip\b/)){response.writeHead(200,{content-encoding:gzip});raw.pipe(zlib.createGzip()).pipe(response);}else{response.writeHead(200,{});raw.pipe(response);}}).listen(1337);接下来创建用于向HTTP服务器请求数据的HTTP客户端向HTTP服务器请求数据将客户端请求头中的accept-encoding字段值设定为“gzipdeflate”​。在接收到服务器端响应后获取响应头中的content-encoding字段值如果字段值为“gzip”​创建Gunzip对象并使用该对象解压缩服务器端响应数据并将其写入应用程序根目录下的raw.txt文件中如果content-encoding字段值为“deflate”​创建Inflate对象并使用该对象解压缩服务器端响应数据并将其写入应用程序根目录下的raw.txt文件中如果content-encoding字段值既不等于“gzip”​也不等于“deflate”​将服务器端响应数据直接写入应用程序根目录下的raw.txt文件中。constzlibrequire(zlib);consthttprequire(http);constfsrequire(fs);//构建请求letrequesthttp.get({host:localhost,path:/,port:1337,headers:{accept-encoding:gzip,deflate}});//监听响应request.on(response,(response){letoutputfs.createWriteStream(raw.txt);switch(response.headers[content-encoding]){casegzip:response.pipe(zlib.createGunzip()).pipe(output);break;casedeflate:response.pipe(zlib.createInflate()).pipe(output);break;default:response.pipe(output);break;}});2、zlib模块中的各种方法在zlib模块中除了各种用于创建对数据进行压缩及解压缩处理的对象的方法之外还提供了表中的各种方法。所有这些方法的第一个参数值均为一个字符串或Buffer对象在方法内部对该字符串或Buffer对象所引用的缓存区中的数据进行压缩或解压缩。在这些方法中不使用在各种用于创建对数据进行压缩及解压缩处理的对象的方法中所使用的options参数即在压缩或解压缩时使用各种默认选项。所有这些方法的第二个参数值均为一个回调函数用于指定压缩或解压缩数据结束时需要执行的处理。该回调函数中的第一个参数值为压缩或解压缩数据失败时触发的错误对象该回调函数中的第二个参数值为一个Buffer对象该Buffer对象所引用的缓存区中存放了压缩或解压缩后的数据。各种用于压缩或解压缩数据的方法方法说明zlib.gzip(buf,callback)使用Gzip算法压缩buf字符串或buf缓存区中的数据zlib.deflate(buf,callback)使用Deflate算法压缩buf字符串或buf缓存区中的数据zlib.deflateRaw(buf,callback)使用Deflate算法压缩buf字符串或buf缓存区中的数据。在压缩数据中不添加zib头zlib.gunzip(buf,callback)使用Gunzip算法解压缩buf缓存区中的数据zlib.inflate(bu,callback)使用Inflate算法解压缩buf缓存区中的数据zlib.inflateRaw(buf,callback)使用Inflate算法解压缩buf缓存区中的数据。在压缩数据中不使用zlib头zlib.unzip(buf,callback)该方法既可使用Gunzip算法解压缩buf缓存区中的数据又可使用Inflate算法解压缩buf缓存区中的数据。根据压缩数据中的zib头来判断使用哪一种算法解压缩数据示例使用gzip方法压缩“abcdefghijklmnopqrstuvwxyz”字符串并且在gzip方法所使用的回调函数中指定将压缩数据输出到应用程序根目录下的compress.log文件中然后使用unzip方法解压缩被压缩数据并且将解压缩数据输出到控制台中。constzlibrequire(zlib);constfsrequire(fs);letoutfs.createWriteStream(aaa.txt);letinputabcdefghijklmnopqrstuvwxyz;zlib.gzip(input,(err,buffer){if(!err){zlib.unzip(buffer,(err,buffer){if(!err){console.log(buffer.toString());out.write(buffer.toString());}});}});

更多文章