Node.js API详解之 zlib模块用法分析
本文实例讲述了Node.jsAPI详解之zlib模块用法。分享给大家供大家参考,具体如下:
Node.jsAPI详解之zlib
zlib模块提供通过Gzip和Deflate/Inflate实现的压缩功能,可以通过这样使用它:
constzlib=require('zlib');
压缩或者解压数据流(例如一个文件)通过zlib流将源数据流传输到目标流中来完成:
constgzip=zlib.createGzip();
constfs=require('fs');
constinp=fs.createReadStream('input.txt');
constout=fs.createWriteStream('input.txt.gz');
inp.pipe(gzip).pipe(out);
zlib可以用来实现对HTTP中定义的gzip和deflate内容编码机制的支持。
HTTP的Accept-Encoding头字段用来标记客户端接受的压缩编码。
注意:下面给出的示例大幅简化,用以展示了基本的概念。使用zlib编码成本会很高,结果应该被缓存。
//客户端请求示例
constzlib=require('zlib');
consthttp=require('http');
constfs=require('fs');
constrequest=http.get({host:'example.com',
path:'/',
port:80,
headers:{'Accept-Encoding':'gzip,deflate'}});
request.on('response',(response)=>{
constoutput=fs.createWriteStream('example.com_index.html');
switch(response.headers['content-encoding']){
//或者,只是使用zlib.createUnzip()方法去处理这两种情况
case'gzip':
response.pipe(zlib.createGunzip()).pipe(output);
break;
case'deflate':
response.pipe(zlib.createInflate()).pipe(output);
break;
default:
response.pipe(output);
break;
}
});
//服务端示例
//对每一个请求运行gzip操作的成本是十分高昂的.
//缓存压缩缓冲区是更加高效的方式.
constzlib=require('zlib');
consthttp=require('http');
constfs=require('fs');
http.createServer((request,response)=>{
constraw=fs.createReadStream('index.html');
letacceptEncoding=request.headers['accept-encoding'];
if(!acceptEncoding){
acceptEncoding='';
}
//注意:这不是一个合适的accept-encoding解析器.
//查阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
if(/\bdeflate\b/.test(acceptEncoding)){
response.writeHead(200,{'Content-Encoding':'deflate'});
raw.pipe(zlib.createDeflate()).pipe(response);
}elseif(/\bgzip\b/.test(acceptEncoding)){
response.writeHead(200,{'Content-Encoding':'gzip'});
raw.pipe(zlib.createGzip()).pipe(response);
}else{
response.writeHead(200,{});
raw.pipe(response);
}
}).listen(1337);
Constants(常量)
说明:
这些被定义在zlib.h的全部常量同时也被定义在require('zlib').constants常量上.
注意:以前,可以直接从require('zlib')中获取到这些常量,例如zlib.Z_NO_FLUSH.
目前仍然可以从模块中直接访问这些常量,但是不推荐使用.
demo:
constzlib=require('zlib');
//可接受的flush值.
zlib.constants.Z_NO_FLUSH
zlib.constants.Z_PARTIAL_FLUSH
zlib.constants.Z_SYNC_FLUSH
zlib.constants.Z_FULL_FLUSH
zlib.constants.Z_FINISH
zlib.constants.Z_BLOCK
zlib.constants.Z_TREES
//返回压缩/解压函数的返回值.发送错误时为负值,正值用于特殊但正常的事件.
zlib.constants.Z_OK
zlib.constants.Z_STREAM_END
zlib.constants.Z_NEED_DICT
zlib.constants.Z_ERRNO
zlib.constants.Z_STREAM_ERROR
zlib.constants.Z_DATA_ERROR
zlib.constants.Z_MEM_ERROR
zlib.constants.Z_BUF_ERROR
zlib.constants.Z_VERSION_ERROR
//压缩等级.
zlib.constants.Z_NO_COMPRESSION
zlib.constants.Z_BEST_SPEED
zlib.constants.Z_BEST_COMPRESSION
zlib.constants.Z_DEFAULT_COMPRESSION
//压缩策略
zlib.constants.Z_FILTERED
zlib.constants.Z_HUFFMAN_ONLY
zlib.constants.Z_RLE
zlib.constants.Z_FIXED
zlib.constants.Z_DEFAULT_STRATEGY
Options
说明:
每一个类都有一个options对象.所有的选项都是可选的.
注意:一些选项只与压缩相关,会被解压类忽视.
demo:
constzlib=require('zlib');
constOptions={
flush:zlib.constants.Z_NO_FLUSH,
finishFlush:zlib.constants.Z_FINISH,
chunkSize:16*1024,
windowBits2,//值在8..15的范围内,这个参数的值越大,内存使用率越高,压缩效果越好。如果使用deflateInit,则默认值为15
level:6,//(压缩级别,值在0-9之间,1速度最快,9压缩比最大,各自折中取值6较为合适。仅压缩有效)
memLevel:8,//(指定多少内存应该内部压缩状态进行分配,1是最小内存速度慢压缩比低。9是最大内存,速度最快。默认值为8。仅压缩有效)
strategy:7,//(用于调整压缩算法,仅压缩有效)
dictionary:'||',//(仅解压有效,默认值为空字典)
info:true//(如果true,返回一个buffer对象和engine)
}
zlib.constants
说明:
提供一个列举出Zlib相关常数的对象。
demo:
constzlib=require('zlib');
console.log(zlib.constants);
//{Z_NO_FLUSH:0,
//Z_PARTIAL_FLUSH:1,
//Z_SYNC_FLUSH:2,
//Z_FULL_FLUSH:3,
//Z_FINISH:4,
//Z_BLOCK:5,
//Z_OK:0,
//Z_STREAM_END:1,
//Z_NEED_DICT:2,
//Z_ERRNO:-1,
//Z_STREAM_ERROR:-2,
//Z_DATA_ERROR:-3,
//Z_MEM_ERROR:-4,
//Z_BUF_ERROR:-5,
//Z_VERSION_ERROR:-6,
//Z_NO_COMPRESSION:0,
//Z_BEST_SPEED:1,
//Z_BEST_COMPRESSION:9,
//Z_DEFAULT_COMPRESSION:-1,
//Z_FILTERED:1,
//Z_HUFFMAN_ONLY:2,
//Z_RLE:3,
//Z_FIXED:4,
//Z_DEFAULT_STRATEGY:0,
//ZLIB_VERNUM:4784,
//DEFLATE:1,
//INFLATE:2,
//GZIP:3,
//GUNZIP:4,
//DEFLATERAW:5,
//INFLATERAW:6,
//UNZIP:7,
//Z_MIN_WINDOWBITS:8,
//Z_MAX_WINDOWBITS:15,
//Z_DEFAULT_WINDOWBITS:15,
//Z_MIN_CHUNK:64,
//Z_MAX_CHUNK:Infinity,
//Z_DEFAULT_CHUNK:16384,
//Z_MIN_MEMLEVEL:1,
//Z_MAX_MEMLEVEL:9,
//Z_DEFAULT_MEMLEVEL:8,
//Z_MIN_LEVEL:-1,
//Z_MAX_LEVEL:9,
//Z_DEFAULT_LEVEL:-1}
zlib.createDeflate(options)
说明:
创建并返回一个带有给定options的新的Deflate对象。
可以使用deflate压缩数据。
demo:
constzlib=require('zlib');
constdeflate=zlib.createDeflate();
constfs=require('fs');
constinp=fs.createReadStream('a.js');
console.log(inp.pipe(deflate));
//Deflate{
//_readableState:
//ReadableState{...},
//bytesRead:0,
//_handle:Zlib{jsref:[Circular],onerror:[Function:zlibOnError]},
//_hadError:false,
//_writeState:Uint32Array[0,0],
//_outBuffer:,
//_outOffset:0,
//_level:-1,
//_strategy:0,
//_chunkSize:16384,
//_flushFlag:0,
//_scheduledFlushFlag:0,
//_origFlushFlag:0,
//_finishFlushFlag:4,
//_info:undefined}
zlib.createInflate(options)
说明:
创建并返回一个带有给定options的新的Inflate对象。
Inflate用于解压一个deflate流。
demo:
constzlib=require('zlib');
constdeflate=zlib.createDeflate();
constinflate=zlib.createInflate();
constfs=require('fs');
constinp=fs.createReadStream('a.js');
console.log(inp.pipe(deflate).pipe(inflate));
zlib.createDeflateRaw(options)
说明:
创建并返回一个带有给定options的新的DeflateRaw对象.
使用deflate压缩数据,并且不附加一个zlib头。
demo:
constzlib=require('zlib');
constdeflateRaw=zlib.createDeflateRaw();
constfs=require('fs');
constinp=fs.createReadStream('a.js');
console.log(inp.pipe(deflateRaw));
zlib.createInflateRaw(options)
说明:
创建并返回一个带有给定options的新的InflateRaw对象。
InflateRaw用于解压一个rawdeflate流。
demo:
constzlib=require('zlib');
constdeflateRaw=zlib.createDeflateRaw();
constinflateRaw=zlib.createInflateRaw();
constfs=require('fs');
constinp=fs.createReadStream('a.js');
console.log(inp.pipe(deflateRaw).pipe(inflateRaw));
zlib.createGzip(options)
说明:
创建并返回一个带有给定options的新的Gunzip对象。
使用gzip压缩数据。
demo:
constzlib=require('zlib');
constgzip=zlib.createGzip();
constfs=require('fs');
constinp=fs.createReadStream('a.js');
console.log(inp.pipe(gzip));
zlib.createGunzip(options)
说明:
创建并返回一个带有给定options的新的Gunzip对象
使用Gunzip解压缩gzip流。
demo:
constzlib=require('zlib');
constgzip=zlib.createGzip();
constgunzip=zlib.createGunzip();
constfs=require('fs');
constinp=fs.createReadStream('a.js');
console.log(inp.pipe(gzip).pipe(gunzip));
zlib.createUnzip(options)
说明:
创建并返回一个带有给定options的新的Unzip对象。
Unzip对象通过自动检测头信息解压Gzip或者Deflate压缩的流.
demo:
constzlib=require('zlib');
constgzip=zlib.createGzip();
constunzip=zlib.createUnzip();
constfs=require('fs');
constinp=fs.createReadStream('a.js');
console.log(inp.pipe(gzip).pipe(unzip));
ConvenienceMethods(简便用法)
说明:
上面我们介绍了各个压缩类的使用。下面介绍一些对应的简便用法。
所有这些方法都将Buffer,[TypeArray],DataView,或者字符串作为第一个参数,
一个回调函数作为可选的第二个参数提供给zlib类,会在callback(error,result)中调用.
每一个方法相对应的都有一个接受相同参数,但是没有回调的*Sync版本.
zlib.deflate(buffer[,options],callback)
zlib.deflateSync(buffer[,options])
zlib.inflate(buffer[,options],callback)
zlib.inflateSync(buffer[,options])
zlib.deflateRaw(buffer[,options],callback)
zlib.deflateRawSync(buffer[,options])
zlib.inflateRaw(buffer[,options],callback)
zlib.inflateRawSync(buffer[,options])
zlib.gzip(buffer[,options],callback)
zlib.gzipSync(buffer[,options])
zlib.gunzip(buffer[,options],callback)
zlib.gunzipSync(buffer[,options])
zlib.unzip(buffer[,options],callback)
zlib.unzipSync(buffer[,options])
使用方式如下:
demo:
constinput='.................................';
zlib.deflate(input,(err,buffer)=>{
if(!err){
console.log(buffer.toString('base64'));
}else{
//错误处理
}
});
constbuffer=Buffer.from('eJzT0yMAAGTvBe8=','base64');
zlib.unzip(buffer,(err,buffer)=>{
if(!err){
console.log(buffer.toString());
}else{
//错误处理
}
});
希望本文所述对大家node.js程序设计有所帮助。