Node.jsの標準入力と

  • 53
    Like
  • 0
    Comment
More than 1 year has passed since last update.

当方windows8 x64 Node v10

readFileSyncを使う。一番簡潔

var input = require('fs').readFileSync('/dev/stdin', 'utf8');

けどこれはwindowsでは無理で、パイプのみ

readSyncを使う

var fs = require('fs');
var length = fs.fstatSync(process.stdin.fd).size;
var buffer = new Buffer(length);
var bytesRead = fs.readSync(process.stdin.fd, buffer, 0, length, 0);
var input = buffer.toString('utf8', 0, bytesRead);

fs.fstatSyncでstdinのサイズをしらべてから、fs.readSyncで読み込む。
しかし、これもパイプのみ。

process.stdinのイベントを監視する。

参照

var input = '';
process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(chunk) {
  input += chunk;
});
process.stdin.on('end', function() {
  //do something
});

この方法だとwindows環境ではCtrl+Dを押してもendイベントが発生しないようだ。

readlineモジュールを使う

var lines=[];
var reader = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
});
reader.on('line', function (line) {
  lines.push(line);
});
reader.on('close', function () {
  //do something
});

このやり方のメリットは改行コードを気にしなくていいし、
Ctrl+Dをおせばcloseイベントが発生する。
しかし、パイプを使うとなぜかcloseイベントが発生しない。
issueを見ると、これはバグで修正されていないようだ。
なので

var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', function (line) {
  lines.push(line);
});
process.stdin.on('end', function () {
  //do something
});

なかなか不自然である。

まとめ

どのやり方も面倒