当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Node.js stream.Readable.read([size])用法及代码示例


readable.read([size])

添加于:v0.9.4

参数

readable.read() 方法从内部缓冲区中读取数据并返回。如果没有数据可供读取,则返回null。默认情况下,除非使用 readable.setEncoding() 方法指定了编码或流在对象模式下运行,否则数据将作为 Buffer 对象返回。

可选的size 参数指定要读取的特定字节数。如果 size 字节不可读取,则将返回 null,除非流已结束,在这种情况下,将返回内部缓冲区中剩余的所有数据。

如果未指定size 参数,则将返回内部缓冲区中包含的所有数据。

size 参数必须小于或等于 1 GiB。

readable.read() 方法只能在以暂停模式运行的Readable 流上调用。在流动模式下,会自动调用readable.read(),直到内部缓冲区完全耗尽。

const readable = getReadableStreamSomehow();

// 'readable' may be triggered multiple times as data is buffered in
readable.on('readable', () => {
  let chunk;
  console.log('Stream is readable (new data received in buffer)');
  // Use a loop to make sure we read all currently available data
  while (null !== (chunk = readable.read())) {
    console.log(`Read ${chunk.length} bytes of data...`);
  }
});

// 'end' will be triggered once when there is no more data available
readable.on('end', () => {
  console.log('Reached end of stream.');
});

每次调用 readable.read() 都会返回一个数据块,或 null 。块没有连接。 while 循环是消耗当前在缓冲区中的所有数据所必需的。读取大文件时 .read() 可能会返回 null ,到目前为止已经消耗了所有缓冲的内容,但仍有更多数据尚未缓冲。在这种情况下,当缓冲区中有更多数据时,将发出一个新的 'readable' 事件。最后,当没有更多数据到来时,将发出 'end' 事件。

因此,要从 readable 读取文件的全部内容,有必要跨多个 'readable' 事件收集块:

const chunks = [];

readable.on('readable', () => {
  let chunk;
  while (null !== (chunk = readable.read())) {
    chunks.push(chunk);
  }
});

readable.on('end', () => {
  const content = chunks.join('');
});

无论 size 参数的值如何,对象模式下的 Readable 流将始终从对 readable.read(size) 的调用返回单个项目。

如果readable.read() 方法返回一个数据块,也会发出一个'data' 事件。

在发出 'end' 事件后调用 stream.read([size]) 将返回 null 。不会引发运行时错误。

相关用法


注:本文由纯净天空筛选整理自nodejs.org大神的英文原创作品 stream.Readable.read([size])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。