流读取(0)指令



我在这里找到了一个代码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);
  // ...
}

相关内容

  • 没有找到相关文章

最新更新