情報アイランド

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

Node.jsでデータをgzip解凍する

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

非同期的な解凍

データを非同期的にgzip解凍するにはzlib.gunzip関数を使用します。

var zlib = require('zlib');

zlib.gunzip(buf, function (err, result) {
});

第1引数に解凍するデータをバッファとして指定します。

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

同期的な解凍

データを同期的にgzip解凍するにはzlib.gunzipSync関数を使用します。

var result = zlib.gunzipSync(buf);

第1引数に解凍するデータをバッファとして指定します。

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

ストリームを使用した解凍

ストリームを使用してデータをgzip解凍するにはzlib.createGunzip関数を使用します。

var ugz = zlib.createGunzip();

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

使い分け

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

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

サンプルコード1

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

zlib-gunzip.js

var zlib = require('zlib');

zlib.gunzip(Buffer.from([0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x2b, 0xc9, 0xc8, 0x2c, 0x56, 0x00, 0xa2, 0xe2, 0x92, 0xa2, 0xcc, 0xbc, 0x74, 0x3d, 0x00, 0x6c, 0x0b, 0xdf, 0x99, 0x0f, 0x00, 0x00, 0x00]), function (err, result) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log(result.toString('utf-8'));
    }
});

実行結果

C:\work\node>node zlib-gunzip.js
this is string.

サンプルコード2

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

zlib-gunzip-sync.js

var zlib = require('zlib');

console.log(zlib.gunzipSync(Buffer.from([0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x2b, 0xc9, 0xc8, 0x2c, 0x56, 0x00, 0xa2, 0xe2, 0x92, 0xa2, 0xcc, 0xbc, 0x74, 0x3d, 0x00, 0x6c, 0x0b, 0xdf, 0x99, 0x0f, 0x00, 0x00, 0x00])).toString('utf-8'));

実行結果

C:\work\node>node zlib-gunzip-sync.js
this is string.

サンプルコード3

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

zlib-create-gunzip.js

var zlib = require('zlib');

var ugz = zlib.createGunzip();
ugz.on('data', function (data) {
    console.log(data.toString('utf-8'));
});
ugz.on('error', function (err) {
    console.error(err);
    process.exit(1);
});
ugz.write(Buffer.from([0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x2b, 0xc9, 0xc8, 0x2c, 0x56, 0x00, 0xa2, 0xe2, 0x92, 0xa2, 0xcc, 0xbc, 0x74, 0x3d, 0x00, 0x6c, 0x0b, 0xdf, 0x99, 0x0f, 0x00, 0x00, 0x00]));
ugz.end();

実行結果

C:\work\node>node zlib-create-gunzip.js
this is string.

関連

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

-Node.js