📅  最后修改于: 2023-12-03 15:03:15.209000             🧑  作者: Mango
在 Node.js 中,流是一种处理数据的方式,它可以将数据分成小块进行处理,而不是一次性将所有数据读取到内存中。这种方式更加高效,因为它可以避免对内存的过度使用。
在 Node.js 中,有四种主要类型的流:
可读流是一种从数据源(例如文件、网络套接字等)读取数据的抽象。在 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() 方法将数据发送到转换流,然后再将数据发送到可写流中,最终将数据写入文件中。