Читать весь текст из stdin в строку
Я пишу программу в Node.js, которая (в некоторых ситуациях) хочет действовать как простой фильтр: читать все из stdin (до конца файла), выполнять некоторую обработку, записывать результат в stdout.
Как вы делаете "читать все от stdin"? Ближайшие решения, которые я нашел до сих пор, похоже, работают либо по одной строке за раз с консоли, либо работают только тогда, когда stdin - это файл, а не канал.
Ответы
Ответ 1
Мой пример для этого очень похож на решение, описанное в комментарии выше - предлагая его на верхнем уровне, потому что это очень простой способ сделать это, и это не должно быть только в комментарии.
var fs = require('fs');
var data = fs.readFileSync(0, 'utf-8');
// Data now points to a buffer containing the file contents
Ответ 2
Если вы используете Linux, для этого не требуется сторонний пакет. Конечно, рассмотрите ваши потребности в производительности, но эти две линии будут работать:
const fs = require("fs");
const data = fs.readFileSync("/dev/stdin", "utf-8");
Ян отмечает в комментариях ниже, что более переносимым решением было бы использование 0
, поскольку это стандарт POSIX. Итак, вы можете просто использовать:
const fs = require("fs");
const data = fs.readFileSync(0, "utf-8");
data
теперь строка с вашими данными из stdin, интерпретируемая как utf 8
Ответ 3
get-stdin будет делать трюк.
Несколько заметок, читающих строки в вашем вопросе.
Поскольку вы отметили вопрос "синхронный", я просто хочу отметить, что stdin isync - только в node.js. Вышеупомянутая библиотека является самой простой. Он будет обрабатывать весь ввод как строку или буфер.
Если возможно, лучше всего писать вашу программу в стиле потоковой передачи, но некоторые варианты использования возможны для потоковой передачи (например, количество слов), а некоторые нет (т.е. Обратный ввод).
Также "одна строка за раз с консоли" является артефактом терминала, который буферизует ваши нажатия клавиш. Если вы хотите, чтобы какой-то "извините, я попросил" подробно рассказать об удивительном TTY Demystified.
Ответ 4
Я использую следующее в узле 11+
async function read(stream) {
let buffer = Buffer.alloc(0);
for await (const chunk of stream) {
buffer = Buffer.concat([buffer, chunk]);
}
return buffer.toString('utf8');
}
Использование:
const input = await read(process.stdin);
Ответ 5
Это также работает, используя новые потоки2 api
var fs = require("fs");
var readStream = fs.createReadStream('./Ip.txt');
readStream.on("readable", function(){
var buf = readStream.read();
console.log(buf.toString());
})