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')
});
我正在尝试解析一个文件,并将 "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')
});