以下是詹姆斯·哈利迪(又名亚克萨德)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;事件,但仅在输入结束时。我尝试阅读可读的流源,但它非常繁重。有谁知道这个例子是如何工作的?