2012-09-17 19 views

答えて

5

使用zlib.createGzip/createDeflateオブジェクトのオプションで、あなたが必要とするコンプレッサーのインスタンスを取得します。

あなたはすべてのメモリ内にこれを行いたい場合は:もちろん

var zlib = require('zlib'); 

// create a new gzip object 
var gzip = zlib.createGzip({ 
    level: 9 // maximum compression 
}), buffers=[], nread=0; 

// attach event handlers... 

gzip.on('error', function(err) { 
    gzip.removeAllListeners(); 
    gzip=null; 
}); 

gzip.on('data', function(chunk) { 
    buffers.push(chunk); 
    nread += chunk.length; 
}); 


gzip.on('end', function() { 
    var buffer; 
    switch (buffers.length) { 
     case 0: // no data. return empty buffer 
      buffer = new Buffer(0); 
      break; 
     case 1: // only one chunk of data. return it. 
      buffer = buffers[0]; 
      break; 
     default: // concatenate the chunks of data into a single buffer. 
      buffer = new Buffer(nread); 
      var n = 0; 
      buffers.forEach(function(b) { 
       var l = b.length; 
       b.copy(buffer, n, 0, l); 
       n += l; 
      }); 
      break; 
    } 

    gzip.removeAllListeners(); 
    gzip=null; 

    // do something with `buffer` here! 
}); 

// and finally, give it data to compress 
gzip.write(inputBuffer); 
gzip.end(); 

を使用すると、大量のデータを扱っている場合は、ファイルへの出力をストリームではなく、メモリ内のすべてをバッファリングします。

+0

Buffer.concat(バッファ)は、そのcase文よりも単純でなければなりません。 – gluxon

+1

@gluxon:そうです。しかし、Node 0.8までは 'Buffer.concat'は存在しませんでした。古いバージョンでは、このようにしなければなりません。 (私はもともと0.8以前にこのコードを書いていました) – josh3736

+0

はい、私はこのことを数ヶ月後にNodeをよく理解しています。私はこの解決策に感謝しなければならない。 :) – gluxon

関連する問題