从stdin读取所有文本

时间:2015-05-25 14:52:45

标签: node.js stdin synchronous

我正在Node.js中编写一个程序(在某些情况下)想要充当一个简单的过滤器:从stdin读取所有内容(直到文件末尾),进行一些处理,将结果写入stdout。 / p>

你如何做'从stdin'读取所有东西?到目前为止我发现的最接近的解决方案,似乎一次从控制台一行一行,或者只在stdin是文件而不是管道时工作。

4 个答案:

答案 0 :(得分:19)

如果您使用的是Linux,则不需要第三方软件包。当然,请考虑您的性能需求,但这两行将起作用:

const fs = require("fs");
const data = fs.readFileSync("/dev/stdin", "utf-8");

Jan在下面的评论中指出,更便携的解决方案是使用0,因为这是POSIX标准。所以,你可以简单地使用:

const fs = require("fs");
const data = fs.readFileSync(0, "utf-8");

data现在是一个包含stdin数据的字符串,解释为utf 8

答案 1 :(得分:10)

get-stdin可以解决问题。

在你的问题的各行之间阅读一些注释。

由于您标记了问题"同步"我只是注意到stdin在node.js中只是async-only。上面的库是最简单的。它将整个输入作为字符串或缓冲区处理。

如果可能的话,以流媒体风格编写程序是最好的,但有些用例可用于流式传输(即字数统计),有些则不可用(即反向输入)。

同样来自控制台"一次一行#34;是终端缓冲你的击键的神器。如果你想要一些"对不起,我问过"水平细节检查了惊人的the TTY Demystified

答案 2 :(得分:7)

我在Node 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);

答案 3 :(得分:5)

我为此编写的样板非常类似于上面的注释中描述的解决方案-在顶层提供它,因为这是执行此操作的最简单方法,并且不应仅在注释中进行。

var fs = require('fs');
var data = fs.readFileSync(0, 'utf-8');
// Data now points to a buffer containing the file's contents