Node.js Stream(流)

Node.js 中的 Stream 模块是一种用于处理数据流的抽象接口。Stream 模块可以用于创建可读、可写或可读写的流。

Stream 模块在 Node.js 核心库中,所以在任何 Node.js 程序中都可以使用它。要使用 Stream 模块,首先需要加载 stream 模块,然后可以使用 ReadableWritableDuplex 类创建流。

例如,下面的代码创建了一个可读流,该流从字符串 "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.stdinprocess.stdout 可以用于处理标准输入和标准输出,fs.createReadStreamfs.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 程序更加高效、可维护。

你可能感兴趣的:(Node.js,node.js,前端,javascript)