Node.js进修之路18——紧缩与解压

紧缩与解紧缩处置惩罚

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头来推断运用哪种算法解紧缩数据
    原文作者:Karuru
    原文地址: https://segmentfault.com/a/1190000013424505
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞