初めに
最近になって、あらためて Node.jsでatCoderやLeetCodeでアルゴリズム問題を解いてみようと思ったのですが、Node.jsの標準入力の書き方は調べてみると色々あってどれがいいんだろうと少し迷ったので、いい機会なのでまとめてみました。
Node.js(標準入力)のパターン
1. /dev/stdin
をreadFileSync
を利用して読み込む
var input = require("fs").readFileSync("/dev/stdin", "utf8");
console.log(input);
標準入力を表す特殊ファイル(/dev/stdin
)をreadFileSync
で読み込みます。
メリット : 記述がかなりシンプル
デメリット: /dev/stdin
はUNIX系のOSでしか利用できないので、Windowsでは利用できない
2. process.stdin
をreadline
モジュールを利用して読む
process.stdin.setEncoding("utf8");
var lines = [];
var reader = require("readline").createInterface({
input: process.stdin,
});
reader.on("line", (line) => {
//改行ごとに"line"イベントが発火される
lines.push(line); //ここで、lines配列に、標準入力から渡されたデータを入れる
});
reader.on("close", () => {
//標準入力のストリームが終了すると呼ばれる
console.log(lines);
});
改行単位でReadable stream
を処理できるreadline
モジュールを利用してデータを読み込みます。
メリット : 改行単位で読み込めるので、1行ごとで処理を行う場合や一度に処理するにはインプットが大きすぎる場合には便利。
デメリット: 改行ごとの処理と読み込み完了後の処理に分かれるため、記述量が多い。
3. process.stdin
を for await...of
を利用して読む
(async () => {
const buffers = [];
for await (const chunk of process.stdin) buffers.push(chunk);
const buffer = Buffer.concat(buffers);
const text = buffer.toString();
console.log(text);
})()
標準入力を非同期のイテラブルなオブジェクトとしてループで処理します。
メリット : 分割して読み込みされるので、一度に処理しきれないインプットを扱う場合には便利。
デメリット: 文字列への変換が必要なので、やや記述量が多い。またデータが分割される場所をコントロールしにくい。
おわりに
Windowsを利用していない場合やインプットが多くない場合は1の方法を利用して、それ以外のケースでは必要に応じて2または3の方法で記述するのが良さそうだなと思いました。
それでは素敵なNode.jsライフを。