在RingoJS中有一个function,名为read
,它允许您读取整个流直到到达末尾。这在您制作命令行应用程序时很有用。举例如下,你可以写一个tac
program:如何读取node.js中的整个文本流?
#!/usr/bin/env ringo
var string = system.stdin.read(); // read the entire input stream
var lines = string.split("\n"); // split the lines
lines.reverse(); // reverse the lines
var reversed = lines.join("\n"); // join the reversed lines
system.stdout.write(reversed); // write the reversed lines
这可以让你启动一个程序并运行tac
命令。然后你,你希望键入尽可能多的行,你就大功告成之后,你可以按Ctrl键+(在Windows或按Ctrl +ž)d信号的end of transmission。
我想在node.js中做同样的事情,但我找不到可以这样做的任何函数。我想到了用readSync
function从fs
库模拟如下,但无济于事:
fs.readSync(0, buffer, 0, buffer.length, null);
的file descriptor for 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.<anonymous> (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的一个字符串?一个代码示例会非常有帮助。
您无法在异步流中同步读取。无论如何,你为什么要? – tjameson
我正在尝试做同样的事情。原因是在我的程序中创建一个交互选项,这有很多原因。一个异步阅读器不会帮助太多。 – ton
这里有一个方法https://www.npmjs。com/package/readline-sync:http://stackoverflow.com/questions/8452957/synchronously-reading-stdin-in-windows/27931290#27931290 – ton