Stream に複数の Stream を pipe でつなげる
「Stream
を制する者、Node.js を制する」だそうです。
私がやりたいことは、次のようなものです。一つのファイルを読み込んで、条件に応じて、いくつかのファイルに振り分ける。よくある処理ですね。
API ドキュメントを読むと、`Stream` の readable.pipe(destination[, options])
の項に次のような記述があります。
Multiple destinations can be piped to safely.(意訳: 一つのストリームに、複数のストリームをパイプで接続しても大丈夫。)
その直後のコードが例なのかな、と思って読むと、全然そんな感じではないので、自分で試してみることにしました。
標準入力から読み込んだデータを、3つの WritableStream
に接続してみます。
"use strict";
const fs = require("fs");
const writer1 = fs.createWriteStream("./1.txt", { encoding: "UTF-8" }),
writer2 = fs.createWriteStream("./2.txt", { encoding: "UTF-8" }),
writer3 = fs.createWriteStream("./3.txt", { encoding: "UTF-8" });
process.stdin.pipe(writer1);
process.stdin.pipe(writer2);
process.stdin.pipe(writer3);
動かしてみます。適当なデータを標準入力から与えます。
$ node multi-pipes.js abc def 123 $
出力先のファイルの内容を確認します。
$ cat 1.txt abc def 123 $ cat 2.txt abc def 123 $ cat 3.txt abc def 123 $
接続した 3つの `WritableStream` に、同じデータが流れています。確かに、複数のパイプを接続しても大丈夫です。