javascript - readline rl.write 如何工作?

标签 javascript node.js stream readline

我正在尝试解析一个文件,并将“foobar”行替换为“bazbar”行。它只是返回一个空文件。我不知道我做错了什么,文档也没有特别帮助。

var readline = require('readline');
var fs = require('fs');

var rl = readline.createInterface({
  input: fs.createReadStream('test/in.txt'),
  output: fs.createWriteStream('test/out.txt', {
    flags: 'r+'
  })
});

rl.on('line', function (line) {
  if (line.match(/foobar/)) {
    rl.write(line.replace(/foo/, 'baz'));
  }
});

如果有人有兴趣简单地拉动和搞乱它,这里是 tmp 存储库:https://github.com/corysimmons/css-body-components/tree/master/test

最佳答案

这可能无法回答您的问题,但它完成了任务。

我无法让 rl.write 对文件 WriteStream 工作,但我确实通过直接写入文件 WriteStream 使其工作> 相反。代码如下:

var readline = require('readline');
var fs = require('fs');

var ws = fs.createWriteStream(__dirname + '/test/out.txt', { flags: 'r+', defaultEncoding: 'utf8' })

var rl = readline.createInterface({
  input: fs.createReadStream(__dirname + '/test/in.txt')
});

rl.on('line', function (line) {
  if (line.match(/foobar/)) {
    line = line.replace(/foo/, 'baz');
  }
  ws.write(line + '\n');
});

rl.on('close', function() {
  ws.close()
})

编辑:rl.write 只会写入 TTY

查看source for readline , Node 正在检查 output 中提供的流是否是终端。如果是,它会写入流,如果不是,它看起来会以 line 事件的形式重新发出写入。

这意味着您必须欺骗 readline 模块,使其认为您的 fs.WriteStream 实际上是 TTY。这是一些有效的更新代码。请注意,第 5 行添加了一个 isTTY 属性并将其设置为 true

var readline = require('readline');
var fs = require('fs');

var ws =  fs.createWriteStream(__dirname + '/test/out.txt', { flags: 'r+', defaultEncoding: 'utf8' })
ws.isTTY = true

var rl = readline.createInterface({
  input: fs.createReadStream(__dirname + '/test/in.txt'),
  output: ws
});

rl.on('line', function (line) {
  var ln
  if (line.match(/foobar/)) {
    ln = line.replace(/foo/, 'baz')
  }
  rl.write(ln, '\n')
});

关于javascript - readline rl.write 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35532332/

相关文章:

javascript - 打开 json 文件时出错

javascript - 未捕获的类型错误 : Object #<Object> has no method "leanModal"

node.js - 是否可以在nodemailer中动态设置发件人地址?

video - 添加对自定义视频输入硬件的 QuickTime 支持

javascript - 浏览器情况下的 href ="#"和后退按钮

javascript - 如何通过 JavaScript 中的鼠标悬停事件使 HTML 边框改变颜色?

node.js - 如何在 WebStorm IDE 上的 LoopBackJs 框架中启用调试日志记录?

node.js - 在 NPM 启动时下载模块

ios - UIWebview 广播流在后台播放?

c++ - 为什么在 C++ 中使用流?