情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでデータをデフレート(deflate)圧縮する

データをデフレート圧縮するには非同期的に圧縮する方法と同期的に圧縮する方法とストリームを使用して圧縮する方法の3つがあります。

非同期的な圧縮

データを非同期的にデフレート圧縮するにはzlib.deflate関数を使用します。

var zlib = require('zlib');

zlib.deflate('xxx', function (err, result) {
});

第1引数に圧縮するデータを指定します。文字列かバッファを指定します。

第2引数にコールバック関数を指定します。この関数の第1引数はエラーオブジェクトであり、第2引数は圧縮されたデータです。

同期的な圧縮

データを同期的にデフレート圧縮するにはzlib.deflateSync関数を使用します。

var result = zlib.deflateSync('xxx');

第1引数に圧縮するデータを指定します。文字列かバッファを指定します。

返り値として圧縮されたデータが得られます。

ストリームを使用した圧縮

ストリームを使用してデータをデフレート圧縮するにはzlib.createDeflate関数を使用します。

var d = zlib.createDeflate();

返り値としてデータを圧縮する変換ストリームが得られます。

使い分け

原則的にはzlib.deflate関数かzlib.createDeflate関数を使用するべきであり、特に理由がないならzlib.deflateSync関数は使用するべきではありません。

これは、データの圧縮は非常に時間の掛かる処理であるためです。データの圧縮を同期的に行うと圧縮が完了するまでプログラムは他の処理を行うことができません。長い時間プログラムが他の処理を行うことができない状態になると様々な問題を引き起こす可能性があります(このような現象をスターベーションと言います)。

サンプルコード1

zlib.deflate関数の使用例です。

zlib-deflate.js

var zlib = require('zlib');

zlib.deflate('this is string.', function (err, result) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log(result);
    }
});

実行結果

C:\work\node>node zlib-deflate.js
<Buffer 78 9c 2b c9 c8 2c 56 00 a2 e2 92 a2 cc bc 74 3d 00 2d ca 05 9a>

サンプルコード2

zlib.deflateSync関数の使用例です。

zlib-deflate-sync.js

var zlib = require('zlib');

console.log(zlib.deflateSync('this is string.'));

実行結果

C:\work\node>node zlib-deflate-sync.js
<Buffer 78 9c 2b c9 c8 2c 56 00 a2 e2 92 a2 cc bc 74 3d 00 2d ca 05 9a>

サンプルコード3

zlib.createDeflate関数の使用例です。

zlib-create-deflate.js

var zlib = require('zlib');

var d = zlib.createDeflate();
d.on('data', function (data) {
    console.log(data);
});
d.on('error', function (err) {
    console.error(err);
    process.exit(1);
});
d.write('this is string.');
d.end();

実行結果

C:\work\node>node zlib-create-deflate.js
<Buffer 78 9c>
<Buffer 2b c9 c8 2c 56 00 a2 e2 92 a2 cc bc 74 3d 00 2d ca 05 9a>

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js