ZLIB

1年前 阅读 147 评论 0 赞 0

Zlib

稳定度: 2 - 稳定

要获取这个模块,你可以通过:

  1. var zlib = require('zlib');

它提供了Gzip/GunzipDeflate/InflateDeflateRaw/InflateRaw类的绑定。每个类都有相同的选项,并且都是可读/可写流。

例子

可以通过将一个fs.ReadStream的数据导入一个zlib流,然后导入一个fs.WriteStream,来压缩或解压缩一个文件。

  1. var gzip = zlib.createGzip();
  2. var fs = require('fs');
  3. var inp = fs.createReadStream('input.txt');
  4. var out = fs.createWriteStream('input.txt.gz');
  5. inp.pipe(gzip).pipe(out);

通过使用便捷方法,可以在一个步骤里完成压缩或解压缩数据。

  1. var input = '.................................';
  2. zlib.deflate(input, function(err, buffer) {
  3. if (!err) {
  4. console.log(buffer.toString('base64'));
  5. }
  6. });
  7. var buffer = new Buffer('eJzT0yMAAGTvBe8=', 'base64');
  8. zlib.unzip(buffer, function(err, buffer) {
  9. if (!err) {
  10. console.log(buffer.toString());
  11. }
  12. });

如果要在 HTTP 客户端或服务器上使用这个模块,在请求时需要带上accept-encoding头,在响应时需要带上content-encoding头。

注意,这些例子都只是非常简单的展示了一些基本的概念。zlib编码的开销是非常昂贵的,并且结果需要被缓存。更多关于速度/内存/压缩的权衡,请参阅下文的内存使用调优

  1. // client request example
  2. var zlib = require('zlib');
  3. var http = require('http');
  4. var fs = require('fs');
  5. var request = http.get({ host: 'izs.me',
  6. path: '/',
  7. port: 80,
  8. headers: { 'accept-encoding': 'gzip,deflate' } });
  9. request.on('response', function(response) {
  10. var output = fs.createWriteStream('izs.me_index.html');
  11. switch (response.headers['content-encoding']) {
  12. // or, just use zlib.createUnzip() to handle both cases
  13. case 'gzip':
  14. response.pipe(zlib.createGunzip()).pipe(output);
  15. break;
  16. case 'deflate':
  17. response.pipe(zlib.createInflate()).pipe(output);
  18. break;
  19. default:
  20. response.pipe(output);
  21. break;
  22. }
  23. });
  24. // server example
  25. // Running a gzip operation on every request is quite expensive.
  26. // It would be much more efficient to cache the compressed buffer.
  27. var zlib = require('zlib');
  28. var http = require('http');
  29. var fs = require('fs');
  30. http.createServer(function(request, response) {
  31. var raw = fs.createReadStream('index.html');
  32. var acceptEncoding = request.headers['accept-encoding'];
  33. if (!acceptEncoding) {
  34. acceptEncoding = '';
  35. }
  36. // Note: this is not a conformant accept-encoding parser.
  37. // See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
  38. if (acceptEncoding.match(/\bdeflate\b/)) {
  39. response.writeHead(200, { 'content-encoding': 'deflate' });
  40. raw.pipe(zlib.createDeflate()).pipe(response);
  41. } else if (acceptEncoding.match(/\bgzip\b/)) {
  42. response.writeHead(200, { 'content-encoding': 'gzip' });
  43. raw.pipe(zlib.createGzip()).pipe(response);
  44. } else {
  45. response.writeHead(200, {});
  46. raw.pipe(response);
  47. }
  48. }).listen(1337);

zlib.createGzip([options])

根据一个options,返回一个新的Gzip对象。

zlib.createGunzip([options])

根据一个options,返回一个新的Gunzip对象。

zlib.createDeflate([options])

根据一个options,返回一个新的Deflate对象。

zlib.createInflate([options])

根据一个options,返回一个新的Inflate对象。

zlib.createDeflateRaw([options])

根据一个options,返回一个新的DeflateRaw对象。

zlib.createInflateRaw([options])

根据一个options,返回一个新的InflateRaw对象。

zlib.createUnzip([options])

根据一个options,返回一个新的Unzip对象。

Class: zlib.Zlib

这个类未被zlib模块暴露。它之所以会出现在这里,是因为它是compressor/decompressor类的基类。

zlib.flush([kind], callback)

kind默认为zlib.Z_FULL_FLUSH

冲刷等待中的数据。不要轻率地调用这个方法,过早的冲刷会给压缩算法带来消极影响。

zlib.params(level, strategy, callback)

动态地更新压缩等级和压缩策略。只适用于deflate算法。

zlib.reset()

compressor/decompressor重置为默认值。只使用于inflatedeflate算法。

Class: zlib.Gzip

使用gzip压缩数据。

Class: zlib.Gunzip

解压一个gzip流。

Class: zlib.Deflate

使用deflate压缩数据。

Class: zlib.Inflate

解压一个deflate流。

Class: zlib.DeflateRaw

使用deflate压缩数据,不添加zlib头。

Class: zlib.InflateRaw

解压一个原始deflate流。

Class: zlib.Unzip

通过自动探测头信息,解压GzipDeflate压缩流。

便捷方法

所有的方法接受一个字符串或一个buffer作为第一个参数,并且第二个参数是一个可选的 zlib类的配置,并且会以callback(error, result)的形式执行提供的回调函数。

每一个方法都有一个同步版本,除去回调函数,它们接受相同的参数。

zlib.deflate(buf[, options], callback)

zlib.deflateSync(buf[, options])

使用Deflate压缩一个字符串。

zlib.deflateRaw(buf[, options], callback)

zlib.deflateRawSync(buf[, options])

使用DeflateRaw压缩一个字符串。

zlib.gzip(buf[, options], callback)

zlib.gzipSync(buf[, options])

使用Gzip压缩一个字符串。

zlib.gunzip(buf[, options], callback)

zlib.gunzipSync(buf[, options])

使用Gunzip压缩一个字符串。

zlib.inflate(buf[, options], callback)

zlib.inflateSync(buf[, options])

使用Inflate压缩一个字符串。

zlib.inflateRaw(buf[, options], callback)

zlib.inflateRawSync(buf[, options])

使用InflateRaw压缩一个字符串。

zlib.unzip(buf[, options], callback)

zlib.unzipSync(buf[, options])

使用Unzip压缩一个字符串。

Options

每一个类都接受一个options对象。所有的options对象都是可选的。

注意一些选项只与压缩相关,会被解压缩类忽略:

  • flush (默认:zlib.Z_NO_FLUSH)
  • chunkSize (默认:16*1024)
  • windowBits
  • level (仅用于压缩)
  • memLevel (仅用于压缩)
  • strategy (仅用于压缩)
  • dictionary (仅用于deflate/inflate,默认为空目录)

参阅http://zlib.net/manual.html#AdvanceddeflateInit2inflateInit2的描述来获取更多信息。

内存使用调优

来自zlib/zconf.h,将其修改为io.js的用法:

默认的内存要求(字节)为:

  1. (1 << (windowBits+2)) + (1 << (memLevel+9))

换言之:windowBits=15的128 K 加上 menLevel = 8(默认值)的128 K 加上其他小对象的一些字节。

例子,如果你想要将默认内存需求从256 K减少至128 K,将选项设置为:

  1. { windowBits: 14, memLevel: 7 }

当然,它会降低压缩等级(没有免费的午餐)。

inflate的内存需求(字节)为:

  1. 1 << windowBits

换言之:windowBits=15(默认值)的32 K 加上其他小对象的一些字节。

这是内部输出缓冲外的chunkSize大小,默认为16 K。

zlib压缩的速度动态得受设置的压缩等级的影响。高的等级会带来更好地压缩效果,但是花费的时间更长。低的等级会带来更少的压缩效果,但是更快。

通常,更高的内存使用选项意味着io.js会调用zlib更少次数,因为在一次单独的写操作中它可以处理更多的数据。所以,这是影响速度和内存占用的另一个因素。

常量

所有在zlib.h中定义的常量,都也被定义在了require('zlib')中。大多数操作中,你都将不会用到它们。它们出现在这里只是为了让你对它们的存在不套感到惊讶。该章节几乎完全来自zlib文件。更多详情请参阅http://zlib.net/manual.html#Constants

允许的冲刷值:

  1. zlib.Z_NO_FLUSH
  2. zlib.Z_PARTIAL_FLUSH
  3. zlib.Z_SYNC_FLUSH
  4. zlib.Z_FULL_FLUSH
  5. zlib.Z_FINISH
  6. zlib.Z_BLOCK
  7. zlib.Z_TREES

compression/decompression函数的返回码。负值代表错误,正值代表特殊但是正常的事件:

  1. zlib.Z_OK
  2. zlib.Z_STREAM_END
  3. zlib.Z_NEED_DICT
  4. zlib.Z_ERRNO
  5. zlib.Z_STREAM_ERROR
  6. zlib.Z_DATA_ERROR
  7. zlib.Z_MEM_ERROR
  8. zlib.Z_BUF_ERROR
  9. zlib.Z_VERSION_ERROR

压缩等级:

  1. zlib.Z_NO_COMPRESSION
  2. zlib.Z_BEST_SPEED
  3. zlib.Z_BEST_COMPRESSION
  4. zlib.Z_DEFAULT_COMPRESSION

压缩策略:

  1. zlib.Z_FILTERED
  2. zlib.Z_HUFFMAN_ONLY
  3. zlib.Z_RLE
  4. zlib.Z_FIXED
  5. zlib.Z_DEFAULT_STRATEGY

data_type域的可能值:

  1. zlib.Z_BINARY
  2. zlib.Z_TEXT
  3. zlib.Z_ASCII
  4. zlib.Z_UNKNOWN

deflate压缩方法(当前版本只支持这一个):

  1. zlib.Z_DEFLATED

用于初始化zalloczfreeopaque

  1. zlib.Z_NULL
你的支持将鼓励作者继续创作

评论(0)

(无)