我在这里找到了一个代码https://github.com/substack/stream-handbook它从流中读取3个字节。我不明白它是如何运作的。
process.stdin.on('readable', function() {
var buf = process.stdin.read(3);
console.log(buf);
process.stdin.read(0);
});
被这样称呼:
(echo abc; sleep 1; echo def; sleep 1; echo ghi) | node consume.js
它返回:
<Buffer 61 62 63>
<Buffer 0a 64 65>
<Buffer 66 0a 67>
<Buffer 68 69 0a>
首先,为什么我需要这个.read(0)
的东西?流不是有一个缓冲区,在我通过.read(size)
请求之前,其余的数据都存储在那里吗?但如果没有.read(0)
,它将打印
<Buffer 61 62 63>
<Buffer 0a 64 65>
<Buffer 66 0a 67>
为什么?
第二个是这些sleep 1
指令。如果我调用没有它的脚本
(echo abc; echo def; echo ghi) | node consume.js
它将打印
<Buffer 61 62 63>
<Buffer 0a 64 65>
不管我是否使用CCD_ 5。我不完全理解这一点。这里使用了什么逻辑来打印这样的结果?
我不确定https://github.com/substack/stream-handbook尝试使用read(0)方法显示,但IMHO这是正确的方法:
process.stdin.on('readable', function () {
let buf;
// Every time when the stream becomes readable (it can happen many times),
// read all available data from it's internal buffer in chunks of any necessary size.
while (null !== (buf = process.stdin.read(3))) {
console.dir(buf);
}
});
您可以更改区块大小,在有睡眠或无睡眠的情况下传递输入…
这些天我碰巧学习了NodeJS流模块。以下是Readable.prototype.read函数中的一些注释:
// if we're doing read(0) to trigger a readable event, but we
// already have a bunch of data in the buffer, then just trigger
// the 'readable' event and move on.
它说,在调用.read(0)
之后,如果stream
没有结束,stream
将只触发(使用process.nextTick
)另一个readable
事件。
function emitReadable(stream) {
// ...
process.nextTick(emitReadable_, stream);
// ...
}