当方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
});
なかなか不自然である。
まとめ
どのやり方も面倒