如何在node.js中读取整个文本流?

13 浏览
0 Comments

如何在node.js中读取整个文本流?

在RingoJS中,有一个名为`read`的函数,可以将整个流读取到结束。这在制作命令行应用程序时非常有用。例如,你可以编写一个名为`tac`的程序,如下所示:

#!/usr/bin/env ringo
var string = system.stdin.read(); // 读取整个输入流
var lines = string.split("\n");   // 拆分行
lines.reverse();                  // 反转行
var reversed = lines.join("\n");  // 连接反转后的行
system.stdout.write(reversed);    // 输出反转后的行

这样,你可以启动一个shell并运行`tac`命令。然后,你可以输入任意行数,完成后按下`Ctrl`+`D`(或Windows上的`Ctrl`+`Z`)来表示传输结束。

我想在node.js中实现同样的功能,但是我找不到任何可以实现的函数。我尝试使用`fs`库中的`readSync`函数来模拟,但没有成功:

fs.readSync(0, buffer, 0, buffer.length, null);

`stdin`的文件描述符(第一个参数)是`0`。所以它应该从键盘读取数据。但实际上它给我返回了以下错误:

Error: ESPIPE, invalid seek
    at Object.fs.readSync (fs.js:381:19)
    at repl:1:4
    at REPLServer.self.eval (repl.js:109:21)
    at rli.on.self.bufferedCmd (repl.js:258:20)
    at REPLServer.self.eval (repl.js:116:5)
    at Interface. (repl.js:248:12)
    at Interface.EventEmitter.emit (events.js:96:17)
    at Interface._onLine (readline.js:200:10)
    at Interface._line (readline.js:518:8)
    at Interface._ttyWrite (readline.js:736:14)

在node.js中,如何同步收集输入文本流中的所有数据并将其作为字符串返回?提供一个代码示例将非常有帮助。

0