我正在使用Node.js流逐行读取文本文件,进行一些转换并输出到SVG文件。但是在处理完成后,我尝试写入最后一个数据(
Solution 2(针对
</svg>
),然而在写入流发出finish
事件时,尝试调用write()
将抛出Error: write after end
的错误。有没有一种优雅的方法可以解决这个问题?请注意:输入文件很大(约1GB),因此由于其I / O和内存管理,无法绕过pipe()
方法。var fs = require('fs');
var split2 = require('split2');
var through2 = require('through2');
var read_stream = fs.createReadStream('input.txt');
var write_stream = fs.createWriteStream('output.svg');
write_stream.write('<svg>');
write_stream.on('finish', function() {
this.write('</svg>'); // doesn't work
});
read_stream
.pipe(split2())
.pipe(through2.obj(function(line, encoding, next) {
this.push(line);
next();
}))
.pipe(write_stream);
解决方案
通用解决方案
使用pipe()
将写入流与end:false
选项连接起来,并手动调用end()
方法关闭流。
var fs = require('fs');
var split2 = require('split2');
var through2 = require('through2');
var read_stream = fs.createReadStream('input.txt');
var write_stream = fs.createWriteStream('output.svg');
write_stream.write('<svg>');
read_stream
.pipe(split2())
.pipe(through2.obj(function(line, encoding, next) {
this.push(line);
next();
}))
.pipe(write_stream, { end: false });
read_stream.on('end', function() {
write_stream.end('</svg>');
});
Solution 2(针对through
/through2
转换流的特定解决方案)
through2
有一个flush函数,可用于写入最终数据。
var fs = require('fs');
var split2 = require('split2');
var through2 = require('through2');
var read_stream = fs.createReadStream('input.txt');
var write_stream = fs.createWriteStream('output.svg');
write_stream.write('<svg>');
read_stream
.pipe(split2())
.pipe(through2.obj(function(line, encoding, next) {
this.push(line);
next();
}, function(flush) {
this.push('</svg>');
flush();
}))
.pipe(write_stream);