Node.js 中的 Stream 模块是一种用于处理数据流的抽象接口。Stream 模块可以用于创建可读、可写或可读写的流。
Stream 模块在 Node.js 核心库中,所以在任何 Node.js 程序中都可以使用它。要使用 Stream 模块,首先需要加载 stream
模块,然后可以使用 Readable
、Writable
或 Duplex
类创建流。
例如,下面的代码创建了一个可读流,该流从字符串 "Hello, world!" 读取数据:
const { Readable } = require('stream');
const readable = new Readable();
readable._read = () => {};
readable.push('Hello, world!');
readable.push(null);
下面的代码创建了一个可写流,该流将数据写入到 stdout:
const { Writable } = require('stream');
const writable = new Writable({
write(chunk, encoding, callback) {
console.log(chunk.toString());
callback();
}
});
writable.write('Hello, world!');
writable.end();
下面的代码创建了一个可读写流,该流将输入的数据反转后输出:
const { Duplex } = require('stream');
const duplex = new Duplex({
read() {},
write(chunk, encoding, callback) {
this.push(chunk.toString().split('').reverse().join(''));
callback();
}
});
duplex.push('Hello, world!');
duplex.push(null);
duplex.on('data', chunk => console.log(chunk.toString()));
Stream 模块还提供了许多有用的方法,例如 pipe
方法可以将一个流连接到另一个流上,on
方法可以监听流上的事件,writable.writable
属性可以判断流是否可写,readable.readable
属性可以判断流是否可读。
Stream 模块还提供了许多内置的流对象,例如 process.stdin
和 process.stdout
可以用于处理标准输入和标准输出,fs.createReadStream
和 fs.createWriteStream
可以用于从文件中读取和写入数据。
下面是一个使用 Stream 模块的完整示例,该示例从文件中读取数据,将数据反转后写入到另一个文件中:
const { createReadStream, createWriteStream } = require('fs');
const { Transform } = require('stream');
const transform = new Transform({
transform(chunk, encoding, callback) {
this.push(chunk.toString().split('').reverse().join(''));
callback();
}
});
const input = createReadStream('input.txt');
const output = createWriteStream('output.txt');
input.pipe(transform).pipe(output);
总之,Stream 模块是 Node.js 中处理数据流的强大工具。它提供了可读、可写和可读写的流,以及许多有用的方法和内置流对象。通过正确使用 Stream 模块,可以使 Node.js 程序更加高效、可维护。
需要注意的是,在使用 Stream 模块时,需要遵循一些基本原则。例如,当使用可写流时,需要在调用 write
方法后立即调用 callback
函数,以表示写入已完成。
另外,在使用可读流时,需要在调用 push
方法后立即调用 callback
函数,以表示读取已完成。如果在调用 push
方法后不调用 callback
函数,可能会导致流进入饱和状态,并出现内存泄漏的问题。
在使用可读写流时,需要注意的是,可读写流同时具有可读和可写流的特征。因此,在使用可读写流时,需要同时遵循可读流和可写流的原则。
总之,使用 Stream 模块时需要遵循一些基本原则,以保证流的正常使用。通过遵循这些原则,可以使 Node.js 程序更加高效、可维护。