Dan*_*rzo 6 javascript stream node.js
我正在使用Node.js流逐行浏览文本文件,进行一些转换并输出到SVG文件.
我正在尝试</svg>在处理完成后编写最后一段数据(),但是当写入流发出finish事件时,尝试write()将抛出Error: write after end.
有一种优雅的方式可以解决这个问题吗?
注意:输入文件很大(大约1GB),因此pipe()由于其I/O和内存管理而无法绕过该方法.
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);
Run Code Online (Sandbox Code Playgroud)
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>');
});
Run Code Online (Sandbox Code Playgroud)
through/ through2转换流)through2 具有可用于写入最终数据的刷新功能.
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);
Run Code Online (Sandbox Code Playgroud)
小智 8
看起来管道在完成时会关闭流.
http://nodejs.org/api/stream.html上的文档说明:
默认情况下,当源流发出结束时,在目标上调用end(),以便该目标不再可写.传递{end:false}作为保持目标流打开的选项.
这使作者保持开放状态,以便最后可以写出"再见".
reader.pipe(writer, { end: false });
reader.on('end', function() {
writer.end('Goodbye\n');
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10088 次 |
| 最近记录: |