Node.js 中的 Stream(流)是一种处理流式数据的接口,它允许你按块处理数据,而不是一次性将所有数据加载到内存中。这对于处理大量数据或实时数据流非常有用。
Stream 类型
Node.js 提供了四种主要的流类型:
- Readable Streams(可读流):可以从中读取数据。
- Writable Streams(可写流):可以向其中写入数据。
- Duplex Streams(双工流):既可以读取数据也可以写入数据,例如
net.Socket
(TCP 流)。 - Transform Streams(转换流):在写入数据后,对数据进行转换,然后从流中读取转换后的数据。
Stream 事件
所有 Stream 对象都是 EventEmitter
的实例,它们会触发以下事件:
data
:当有数据可读时触发,返回数据块。end
:当没有更多的数据可读时触发,表示流的结束。error
:在接收和写入过程中发生错误时触发。finish
:当所有数据已被写入到底层系统时触发,通常用于可写流。
从流中读取数据
以下是一个示例,展示了如何从文件中读取数据:
// 引入 fs 模块
var fs = require("fs");
// 创建一个变量来存储读取的数据
var data = '';
// 创建可读流,读取 input.txt 文件
var readerStream = fs.createReadStream('input.txt');
// 设置编码为 utf8
readerStream.setEncoding('UTF8');
// 监听 'data' 事件,当有数据可读时触发
readerStream.on('data', function(chunk) {
// 将数据块添加到 data 变量
data += chunk;
});
// 监听 'end' 事件,当没有更多数据可读时触发
readerStream.on('end', function() {
// 输出读取到的数据
console.log(data);
});
// 监听 'error' 事件,当发生错误时触发
readerStream.on('error', function(err) {
// 输出错误信息
console.log(err.stack);
});
// 输出程序执行信息
console.log("程序执行完毕");
在这个示例中,我们首先引入了 fs
模块,然后创建了一个空字符串 data
来存储从文件中读取的数据。接着,我们使用 fs.createReadStream
方法创建了一个可读流,用于读取 input.txt
文件。