📜  Node.js 中的流及其类型是什么?(1)

📅  最后修改于: 2023-12-03 15:03:15.209000             🧑  作者: Mango

Node.js 中的流及其类型

简介

在 Node.js 中,流是一种处理数据的方式,它可以将数据分成小块进行处理,而不是一次性将所有数据读取到内存中。这种方式更加高效,因为它可以避免对内存的过度使用。

流的类型

在 Node.js 中,有四种主要类型的流:

  • Readable(可读流)
  • Writable(可写流)
  • Duplex(双工流)
  • Transform(转换流)
可读流

可读流是一种从数据源(例如文件、网络套接字等)读取数据的抽象。在 Node.js 中,可以使用 fs 模块来创建可读流。

以下是一个使用可读流读取文件的示例:

const fs = require('fs');

const rs = fs.createReadStream('example.txt');
rs.on('data', (chunk) => {
  console.log(`Received ${chunk.length} bytes of data.`);
});
rs.on('end', () => {
  console.log('Read complete.');
});

在上面的示例中,使用 fs.createReadStream() 方法创建了一个可读流,并指定要读取的文件。当有数据可读取时,'data' 事件将被触发。在 'data' 事件的回调函数中,可以处理接收到的数据。'end' 事件表示读取完成。

可写流

可写流是一种向目标位置(例如文件、网络套接字等)写入数据的抽象。在 Node.js 中,可以使用 fs 模块通过 createWriteStream() 方法创建可写流。

以下是一个使用可写流写入文件的示例:

const fs = require('fs');

const ws = fs.createWriteStream('output.txt');
ws.write('This is some data.');
ws.end();

在上面的示例中,使用 fs.createWriteStream() 方法创建了一个可写流,并将要写入的文件命名为 output.txt。使用 ws.write() 方法写入数据,最后使用 ws.end() 方法关闭流。

双工流

双工流是一种同时具有可读和可写功能的流。在 Node.js 中,可以使用 net 模块创建双工流,可以像读取文件一样读取和写入网络套接字中的数据。

以下是一个使用双工流进行网络通信的示例:

const net = require('net');

const client = net.connect({ port: 8080 }, () => {
  console.log('Connected to server!');
  client.write('Hello, server!');
});

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

client.on('end', () => {
  console.log('Disconnected from server.');
});

在上面的示例中,使用 net.connect() 方法连接到服务器,并使用 client.write() 方法向服务器发送数据。当有数据可读取时,'data' 事件将被触发。当连接关闭时,'end' 事件将被触发。

转换流

转换流是一种同时具有可读和可写功能的流,可以在读取和写入数据时更改数据。在 Node.js 中,可以使用 zlib 模块创建转换流,用于压缩和解压缩数据。

以下是一个使用转换流进行数据压缩的示例:

const fs = require('fs');
const zlib = require('zlib');

const rs = fs.createReadStream('example.txt');
const ws = fs.createWriteStream('example.txt.gz');
const gzip = zlib.createGzip();

rs.pipe(gzip).pipe(ws);

在上面的示例中,使用 fs.createReadStream() 方法创建了一个可读流,并指定要读取的文件。使用 fs.createWriteStream() 方法创建一个可写流,并将要写入的文件命名为 example.txt.gz。使用 zlib.createGzip() 方法创建一个转换流,用于压缩数据。使用可读流的 pipe() 方法将数据发送到转换流,然后再将数据发送到可写流中,最终将数据写入文件中。