readline rl.write 是如何工作的?

How does readline rl.write work?

我正在尝试解析一个文件,并将 "foobar" 的行替换为 "bazbar" 的行。它只是 returns 一个空文件。我不知道我做错了什么,文档也不是特别有用。

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')
});