可读流和读(0)

时间:2015-03-02 04:05:23

标签: node.js stream

以下是詹姆斯·哈利迪(又名亚克萨德)stream-handbook的摘录:

  

这是使用.read(n)将stdin缓冲为3字节的示例   块:

process.stdin.on('readable', function () {
    var buf = process.stdin.read(3);
    console.dir(buf);
});
     

运行此示例为我们提供了不完整的数据!

$ (echo abc; sleep 1; echo def; sleep 1; echo ghi) | node consume1.js 
<Buffer 61 62 63>
<Buffer 0a 64 65>
<Buffer 66 0a 67>
     

这是因为内部缓冲区和我们还有额外的数据   需要给节点一个&#34; kick&#34;告诉它我们对更多感兴趣   超过我们已读过的3个字节的数据。一个简单的.read(0)会   这样做:

process.stdin.on('readable', function () {
    var buf = process.stdin.read(3);
    console.dir(buf);
    process.stdin.read(0);
});
     

现在我们的代码以3字节块的形式正常工作!

$ (echo abc; sleep 1; echo def; sleep 1; echo ghi) | node consume2.js 
<Buffer 61 62 63>
<Buffer 0a 64 65>
<Buffer 66 0a 67>
<Buffer 68 69 0a>

当我将示例更改为2字节读取块时,它会中断 - 可能是因为内部缓冲区仍然排队了数据。但是,如果读取(0)启动“可读”状态,那就不会发生这种情况。每次调用时都会发生事件。看起来它只在所有输入完成后才会发生。

process.stdin.on('readable', function () {
    var buf = process.stdin.read(2);
    console.dir(buf);
    process.stdin.read(0);
});

这段代码在幕后做了什么?似乎读(0)排队另一个可读的&#39;事件,但仅在输入结束时。我尝试阅读可读的流源,但它非常繁重。有谁知道这个例子是如何工作的?

0 个答案:

没有答案