压缩和解压处理在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算法对数据进行压缩使用Deflate算法压缩的数据,根据压缩数据中的zlibheader判断使用哪种算法压缩数据每种方法创建的对象都是可用于读取流数据和写入流数据的对象。每个方法都使用一个可选的options参数,它是一个对象,用于指定压缩或解压data时使用的选项。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:用于设置数据分块时每块的大小,单位为byte,默认属性值为16*1024windowBits:该属性值以2位基数计算压缩窗口的对数,用于设置压缩窗口的大小。属性值在8-15之间,默认为15,属性值越大,压缩效果越好,但内存消耗越多,当使用deflate算法压缩数据时,以及不使用zlib头时压缩数据,属性值也可以是-15~-8的值。level:属性值是一个整数值,用于指定压缩级别,属性值可以是-1或0-9价值。当属性值为0时,不进行压缩处理。该属性值为1时,压缩速度最快,压缩程度最低。当属性值为-1时,表示使用默认压缩比,自动压缩属性值。在速度和压缩之间进行折衷(大多数情况下,折衷的结果相当于将level属性值设置为6)memLevel:该属性值用于指定压缩时为压缩程序分配多少内存,属性值为1对于-9之间的证书,当属性值为1时,消耗的内存最少,但压缩程度降低。属性值为9时,消耗内存最多,但压缩效果最好,默认属性值为8。标准压缩的默认属性值。zlib.Z_HUFFMAN_ONLY,该属性值用于指定压缩数据时使用霍夫曼编码(HuffmanCoding))。霍夫曼编码是一种用于无损数据压缩的熵编码(也称为权重编码)zlib.Z_FILTERED。该属性值用于压缩数据时对数据进行过滤,以达到更好的压缩效果zlib.Z_RLE,该属性值用于指定压缩时的游程编码(Run-LengthEncoding,RLE),游程编码也称为作为游程编码,用不同的码字对连续的黑白像素(游程)的个数进行编码,游程编码是一种简单的无损数据压缩方法,其优点是压缩和解压都非常快,其method它计算连续发生的数据长度压缩。它的缺点是增加了非重复数据的容量。在压缩PNG图片时,游程编码可以达到最好的压缩效果。zlib.Z_FIXED,该属性值用于指定在压缩过程中禁止使用霍夫曼编码,以达到在特殊应用中简化解码过程的目的。由于有Gzip对象,Deflate对象和DeflateRaw对象可以用来读取流数据和写入流数据Data,因此,可以直接使用这些ReadStream对象的pipe方法将文件流数据输出到Gzip对象,Deflate对象和DeflateRaw对象,然后使用这些对象的pipe方法将使用这些对象压缩的流数据输出到另一个压缩文件中。使用Gzip对象压缩文件constzlib=require('zlib');constfs=require('fs');让gzip=zlib.createGzip();letinp=fs.createReadStream('file.txt');letout=fs.createWriteStream('file.txt.gz');inp.pipe(gzip).pipe(out);因为Gunzip对象,Inflate对象,InflateRawobject和Unzipobject既可以读取流数据也可以用来写入流数据。因此,可以直接使用这些ReadStream对象的pipe方法读取压缩文件中的数据输出到一个Gunzip对象、Inflate对象、InflateRaw对象或Unzip对象中,然后再使用这些对象的pipe方法解压使用这些对象在流数据恢复到文件后。使用Gunzip对象解压缩文件constzlib=require('zlib');constfs=require('fs');让gunzip=zlib.createGunzip();让inp=fs。createReadStream('./file.txt.gz');letout=fs.createWriteStream('file.txt');inp.pipe(gunzip).管道(出);在HTTP服务器和HTTP客户端之间传输压缩数据时,需要在客户端请求头中使用accept-encoding字段来指定服务器压缩数据时使用的压缩算法,服务器响应的content-encoding字段应该在标头中用于声明服务器端响应数据的压缩算法。2.zlib模块中的各种方法在zlib模块中,除了创建数据压缩和解压缩处理的各种方法外,还提供了很多方法,所有这些方法的第一个参数值都是一个字符串或者一个Buffer对象,而字符串或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字符串或bufbuffer压缩数据中的数据不加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算法压缩compressthebufstringorbufbufferareadatadoesnotaddthezlibheadertothecompresseddatazlib.unzip(buf,callback(err,buf){..})该方法可以使用Gunzip算法解压buf缓冲区数据,可以使用Inflate算法对buf缓冲区中的数据进行解压,根据压缩后的数据中的zlibheader来决定使用哪种算法对数据进行解压
