紧缩与解紧缩处置惩罚
在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
: 该属性值为整数值,用于指定紧缩级别,属性值能够为-1
或0-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 头来推断运用哪种算法解紧缩数据 |