LoginSignup
78
60

More than 3 years have passed since last update.

Node.jsでの標準入力の書き方をまとめてみた

Posted at

初めに

最近になって、あらためて Node.jsでatCoderやLeetCodeでアルゴリズム問題を解いてみようと思ったのですが、Node.jsの標準入力の書き方は調べてみると色々あってどれがいいんだろうと少し迷ったので、いい機会なのでまとめてみました。

Node.js(標準入力)のパターン

1. /dev/stdinreadFileSyncを利用して読み込む

input1.js
var input = require("fs").readFileSync("/dev/stdin", "utf8");
console.log(input);

標準入力を表す特殊ファイル(/dev/stdin)をreadFileSyncで読み込みます。

メリット : 記述がかなりシンプル
デメリット: /dev/stdinはUNIX系のOSでしか利用できないので、Windowsでは利用できない

2. process.stdinreadlineモジュールを利用して読む

input2.js
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.stdinfor await...ofを利用して読む

input3.js

(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ライフを。

参考リンク

78
60
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
78
60