コンテンツにスキップ

zlib

Since v8.0.75

zlibモジュールは、JSHアプリケーション用にNode.js形式の圧縮・展開APIを提供します。 gzip、deflate、raw deflate、自動検出によるunzip、同期ヘルパー、コールバック方式の非同期ヘルパー、ストリーム形式の処理に対応しています。

一般的な使用方法は以下のとおりです。

const zlib = require('zlib');

同期メソッド

これらのメソッドは、ArrayBufferを返します。

gzipSync()

gzip形式でデータを圧縮します。

gzipSync(data)

gunzipSync()

gzipデータを展開します。

gunzipSync(data)

deflateSync()

deflate形式でデータを圧縮します。

deflateSync(data)

inflateSync()

deflateデータを展開します。

inflateSync(data)

deflateRawSync()

raw deflate形式でデータを圧縮します。

deflateRawSync(data)

inflateRawSync()

raw deflateデータを展開します。

inflateRawSync(data)

unzipSync()

gzipまたはdeflateデータの形式を自動検出して展開します。

unzipSync(data)
入力型

圧縮メソッドは、Stringまたはバイナリ入力を受け取ります。 展開メソッドには、圧縮されたバイナリ入力を指定します。

使用例
1
2
3
4
5
6
const zlib = require('zlib');

const compressed = zlib.gzipSync('Hello, World!');
const decompressed = zlib.gunzipSync(compressed);
const text = String.fromCharCode.apply(null, new Uint8Array(decompressed));
console.println(text);

非同期メソッド

これらのメソッドはコールバック方式です。

gzip(), gunzip(), deflate(), inflate(), deflateRaw(), inflateRaw(), unzip()

構文
gzip(data, callback)
gunzip(data, callback)
deflate(data, callback)
inflate(data, callback)
deflateRaw(data, callback)
inflateRaw(data, callback)
unzip(data, callback)

コールバックのシグネチャは以下のとおりです。

(err, result) => {}

resultは、ArrayBufferで渡されます。

使用例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
const zlib = require('zlib');

zlib.gzip('Hello, World!', (err, compressed) => {
    if (err) {
        console.println(err.message);
        return;
    }
    zlib.gunzip(compressed, (err2, decompressed) => {
        if (err2) {
            console.println(err2.message);
            return;
        }
        const text = String.fromCharCode.apply(null, new Uint8Array(decompressed));
        console.println(text);
    });
});

ストリーム生成メソッド

このモジュールは、ストリーム形式の圧縮・展開オブジェクトも提供します。

  • createGzip()
  • createGunzip()
  • createDeflate()
  • createInflate()
  • createDeflateRaw()
  • createInflateRaw()
  • createUnzip()

各ファクトリーは、以下のメンバーを持つzlibストリームオブジェクトを返します。

メンバー説明
write(data)入力データをストリームに書き込む
end([data])必要に応じて最後のチャンクを書き込み、ストリームを終了
on(event, callback)dataenderrorイベントのリスナーを登録
pipe(dest[, options])出力データを別の書き込み可能な接続先に渡す
flush()対応している場合、保留中の圧縮出力をフラッシュ
close()内部の圧縮・展開オブジェクトを閉じる
bytesWrittenこれまで受け取った入力のバイト数
bytesReadこれまで生成した出力のバイト数

ストリーミングの例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
const zlib = require('zlib');

const gzip = zlib.createGzip();
gzip.on('data', (chunk) => {
    console.println('compressed bytes:', chunk.byteLength);
});
gzip.on('end', () => {
    console.println('done');
});

gzip.write('Hello, ');
gzip.end('World!');

pipe()

pipe()は、次の接続先に対応しています。

  • write(chunk)と、省略可能なend()を持つJavaScriptの書き込み先
  • writerとして公開されたネイティブwriterを基盤とするオブジェクト

既定では、pipe()はzlibストリームの終了時に接続先のend()も呼び出します。 この動作は、{ end: false }で無効にできます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
const zlib = require('zlib');

const gzip = zlib.createGzip();
const dest = {
    write(chunk) {
        return true;
    },
    end() {
        console.println('dest ended');
    }
};

gzip.pipe(dest, { end: false });
gzip.write('hello');
gzip.end();

進捗の追跡

ストリームオブジェクトは、実行中のバイトカウンターを提供します。

  • bytesWritten: 消費した入力の合計バイト数
  • bytesRead: 生成した出力の合計バイト数

カウンターはデータ送出中に継続して更新されるため、dataコールバック内でも確認できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
const zlib = require('zlib');

const compressed = zlib.gzipSync('NAME,AGE\nAlice,30\nBob,25\n');
const gunzip = zlib.createGunzip();

gunzip.on('data', function(chunk) {
    console.println('input bytes:', gunzip.bytesWritten);
    console.println('output bytes:', gunzip.bytesRead);
});

gunzip.write(compressed);
gunzip.end();

constants

このモジュールは、zlib定数をzlib.constantsとしてエクスポートします。

代表的な値:

  • Z_NO_FLUSHZ_SYNC_FLUSHZ_FINISHなどのフラッシュ定数
  • Z_NO_COMPRESSIONZ_BEST_SPEEDZ_BEST_COMPRESSIONZ_DEFAULT_COMPRESSIONなどの圧縮レベル定数
  • Z_OKZ_STREAM_ENDZ_DATA_ERRORなどの状態・戻り値の定数
1
2
3
const { constants } = require('zlib');

console.println(constants.Z_BEST_COMPRESSION);

互換性に関する注意

  • APIはNode.jsに似ていますが、Node.jsのzlibを完全に置き換えるものではありません。
  • ストリームのon()は、dataenderrorのコールバックのみに対応しています。
  • 各zlibストリームはイベントの種類ごとにコールバックを1つだけ保存するため、同じイベントに後から登録したon()が以前のコールバックを置き換えます。
  • 非同期ヘルパーはコールバック方式のみで、Promise方式は提供しません。
最終更新日