我遇到与fs.createReadStream
和fs.createWriteStream
有关的意外行为。我希望有人可以指出我做出错误假设的地方:
我创建了一个像这样的可读写流
let readableStream = fs.createReadStream('./lorem ipsum.doc');
let writableStream = fs.createWriteStream('./output');
为什么,如果我将读取流发送到写入流
let data, chunk;
readableStream
.on('readable', () => {
while ((chunk=stream.read()) !== null) {
data+=chunk;
}
})
.on('end', ()=>{
writableStream.write(data)
console.log("done");
});
我最终在输出文件中出现差异:
如果我像这样流:
let data, chunk;
readableStream
.on('readable', () => {
while ((chunk=stream.read()) !== null) {
writableStream.write(chunk)
}
})
.on('end', ()=>{
console.log("done");
});
一切都很好并且符合预期:
即,在第一个例子中,when / where是否添加了额外的字节数开销?为什么要添加?出了什么问题?
感谢您的启发!
注意:我知道使用pipe
(它给了我正确的输出文件),但这些例子仅供我理解。
答案 0 :(得分:1)
我猜这点在第一个演示中,你使用'data + =',它将二进制流转换为字符串,并浪费了一些空间。你能尝试转换第二个演示吗? ===>
var s=chunk;
writableStream.write(s);
更新:组合流缓冲区的正确方法就像您的评论:
var chunks = [];
var size = 0;
...on('data', function(chunk){
chunks.push(chunk);
size += chunk.length;
})
...on('end', function(){
var buf = Buffer.concat(chunks, size); // use buf to write to writestream
var str = iconv.decode(buf, 'utf8'); // use str to console.log string, which supports all languages such as Asian
})