【问题标题】:Readable and writable streams unexpected behavior可读可写流意外行为
【发布时间】:2016-11-17 14:46:53
【问题描述】:

我遇到了关于 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");
});

我最终在输出文件中发现了一个差异

如果我像这样流式传输:

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

一切都很好,正如预期的那样:

即,在第一个示例中,何时/何处添加了额外的字节开销?为什么要添加它?出了什么问题?

谢谢你的启发!


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

【问题讨论】:

    标签: node.js stream


    【解决方案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
    })
    

    【讨论】:

    • 是的,你是对的。如果我使用let data = Buffer.from([]);,然后使用data = Buffer.concat([data,chunk]);,则文件正确。我太傻了,我没有意识到我正在转换为字符串类型。
    • 或者实际上,javascript 正在转换为字符串类型... :)
    猜你喜欢
    • 2015-04-09
    • 2016-06-04
    • 2017-08-25
    • 2014-03-13
    • 2016-05-28
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多