Читать весь текст из 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());
})