可读和可写流意外行为

时间:2016-11-17 14:46:54

标签: node.js stream

我遇到与fs.createReadStreamfs.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");
});

我最终在输出文件中出现差异

Output file with discrepancy

如果我像这样流:

let data, chunk;
readableStream
.on('readable', () => {
    while ((chunk=stream.read()) !== null) {
        writableStream.write(chunk)
    }
})
.on('end', ()=>{
    console.log("done");
});

一切都很好并且符合预期:

Expected output

即,在第一个例子中,when / where是否添加了额外的字节数开销?为什么要添加?出了什么问题?

感谢您的启发!

注意:我知道使用pipe(它给了我正确的输出文件),但这些例子仅供我理解。

1 个答案:

答案 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
})