在 Node.js 中,Stream 是一种处理流数据的抽象接口。Stream 提供了一种有效的方式来处理大量的数据,而不需要将所有数据加载到内存中。Node.js 中的 Stream 模块包括了可读流(Readable)、可写流(Writable)、双工流(Duplex)、和转换流(Transform)等不同类型的流。

以下是关于 Node.js 中 Stream 的一些基本概念和用法:

1. 可读流(Readable Stream):

可读流用于从数据源读取数据。例如,从文件系统、网络或其他数据源读取数据。
const fs = require('fs');
const readableStream = fs.createReadStream('example.txt');

readableStream.on('data', (chunk) => {
    console.log(`Received ${chunk.length} bytes of data.`);
});

readableStream.on('end', () => {
    console.log('Finished reading data.');
});

2. 可写流(Writable Stream):

可写流用于向目标写入数据。例如,向文件系统、网络或其他目标写入数据。
const fs = require('fs');
const writableStream = fs.createWriteStream('output.txt');

writableStream.write('Hello, World!', 'utf-8');

writableStream.end(); // 结束写入操作

3. 双工流(Duplex Stream):

双工流是可读流和可写流的结合,可以同时进行读写操作。例如,一个 TCP 连接就是一个双工流。
const net = require('net');
const duplexStream = net.connect(3000, 'localhost');

duplexStream.on('data', (chunk) => {
    console.log(`Received ${chunk.length} bytes of data.`);
});

duplexStream.write('Hello, Server!', 'utf-8');

4. 转换流(Transform Stream):

转换流是一种特殊的双工流,用于在读取和写入数据时进行转换。例如,可以使用转换流进行数据压缩或解压缩。
const zlib = require('zlib');
const readableStream = fs.createReadStream('example.txt');
const gzipStream = zlib.createGzip();
const writableStream = fs.createWriteStream('example.txt.gz');

readableStream.pipe(gzipStream).pipe(writableStream);

5. 使用 pipe 连接流:

pipe 方法用于连接流,将一个流的输出直接传递给另一个流的输入。这样可以简化流的处理。
const readableStream = fs.createReadStream('example.txt');
const writableStream = fs.createWriteStream('output.txt');

readableStream.pipe(writableStream);

6. 事件和流:

流是事件的实例,可以通过监听事件来处理流中的数据。
readableStream.on('data', (chunk) => {
    console.log(`Received ${chunk.length} bytes of data.`);
});

writableStream.on('finish', () => {
    console.log('Finished writing data.');
});

7. 使用流处理 HTTP 请求和响应:

可以使用流来处理 HTTP 请求和响应,例如通过 http.createServer 创建一个 HTTP 服务器。
const http = require('http');
const fs = require('fs');

const server = http.createServer((req, res) => {
    const readableStream = fs.createReadStream('example.txt');
    readableStream.pipe(res);
});

server.listen(3000, () => {
    console.log('Server is listening on port 3000');
});

这是关于 Node.js 中 Stream 的一些基础概念和用法。Stream 是一个强大的工具,可以帮助你更有效地处理大量数据,而不需要将所有数据加载到内存中。详细了解流的工作原理和不同类型的流对于构建高性能的 Node.js 应用程序非常重要。


转载请注明出处:http://www.zyzy.cn/article/detail/13160/Node.js