Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 将stdin中的所有文本读取为字符串_Node.js_Stdin_Synchronous - Fatal编程技术网

Node.js 将stdin中的所有文本读取为字符串

Node.js 将stdin中的所有文本读取为字符串,node.js,stdin,synchronous,Node.js,Stdin,Synchronous,我正在Node.js中编写一个程序,它(在某些情况下)希望充当一个简单的过滤器:从stdin(到文件末尾)读取所有内容,进行一些处理,将结果写入stdout 你是如何做到“从标准读入一切”的?到目前为止,我找到的最接近的解决方案似乎可以从控制台一次运行一行,或者只有在stdin是文件而不是管道时才起作用。可以做到这一点 在你问题的字里行间读一些笔记 既然您将问题标记为“synchronous”,我只需要注意stdin仅在node.js中是异步的。上面的库是它得到的最简单的库。它将以字符串或缓冲

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

你是如何做到“从标准读入一切”的?到目前为止,我找到的最接近的解决方案似乎可以从控制台一次运行一行,或者只有在stdin是文件而不是管道时才起作用。

可以做到这一点


在你问题的字里行间读一些笔记

既然您将问题标记为“synchronous”,我只需要注意stdin仅在node.js中是异步的。上面的库是它得到的最简单的库。它将以字符串或缓冲区的形式处理整个输入

如果可能的话,以流式方式编写程序是最好的,但是有些用例对于流式(即字数计数)是可行的,而有些用例则不可行(即反转输入)


另外,“控制台一次一行”是终端缓冲击键的产物。如果您想要一些“对不起,我问了”级别的详细信息,请查看“惊人”。

如果您使用的是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

我在节点11中使用以下命令+

 async function read(stream) {
   const chunks = [];
   for await (const chunk of stream) chunks.push(chunk); 
   return Buffer.concat(chunks).toString('utf8');
 }
用法:

const input = await read(process.stdin);

我的这个锅炉板非常像上面评论中描述的解决方案——在顶层提供,因为这是最简单的方法,不应该只在评论中

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

我建议不要使用此模块,因为,我反对修复此缺陷。是一个似乎可以解决问题的fork。更好的方法是:使用
fs.readFileSync(0,'utf8')
,这应该可以在任何地方使用。(文件描述符0是标准格式)。@Jan Schär在Windows上不起作用。(
TypeError:无法读取未定义的属性“1”)。但确实如此。执行
fs.readFileSync(process.stdin.fd,'utf-8')可能更具可读性这样,阅读它的人就会清楚地知道它是stdin。@NicholasDaley,在节点v11.11.0上使用您的技术时,我遇到以下错误:
错误:EAGAIN:resource暂时不可用,请阅读
。这个答案中的那个仍然可以正常工作。@Sam是的,我在没有使用管道的情况下复制,只使用终端。考虑到
process.stdin.fd==0
似乎一直有效,我想知道这怎么可能。如果
fs.stdin.fd
仅在之前访问,则
0
也会出现此问题,例如:
const fs=require('fs');console.log(process.stdin.fd);log(fs.readFileSync(0,'utf8')如果将一个大文件传输到stdinI,则此操作将失败。在使用此方法时,Windows上出现错误:TypeError:无法读取输入很长的undefinedWorks的属性“1”