Node 可读流与可写流的运用详解
概述
在 Node.js 中,读写操作一般来说都会使用流的方式进行。其中可读流提供了一种将数据从 source 输出到 destination 的抽象方式;而可写流则提供了一种将数据写入 destination 的抽象方式。对于数据中间处理过程,我们可以使用管道(piping)的方式链接可读流和可写流。
可读流
核心方法
Node.js 中可读流分为多种类型,如 fs.createReadStream
和 http.IncomingMessage
等。这些不同类型的可读流都有一些相同的方法:
read()
: 从可读流中读取数据,该方法会返回可读流缓存区中的数据,如果缓存区为空,则返回 null。on('data', callback)
: 当从可读流中读取到数据时,会触发 data 事件,这个回调函数会被调用,回调函数的第一个参数就是读取到的数据。on('end', callback)
: 当可读流中的数据被读取完毕时,会触发 end 事件,回调函数会被调用。
示例1:从文件中读取数据
下面是一个从文件中读取数据的例子:
const fs = require('fs');
const rs = fs.createReadStream('input.txt');
rs.on('data', (chunk) => {
console.log(`Received ${chunk.length} bytes of data.`);
});
rs.on('end', () => {
console.log('File reading is finished.');
});
上述代码中,我们使用 createReadStream
方法创建了一个可读流,并指定要读取的源文件是 input.txt
。之后,我们监听了可读流的 data
事件和 end
事件。当有数据可读时,会将数据按照 chunk
的方式传递给data
事件的回调函数,并输出收到的数据长度。当可读流中的数据读取完毕时,会触发 end
事件,回调函数会被调用并输出提示。
可写流
核心方法
Node.js 中可写流分为多种类型,如 fs.createWriteStream
和 http.ServerResponse
等。这些不同类型的可写流都有一些相同的方法:
write(chunk, [callback])
: 将数据写入可写流中。end([chunk], [encoding], [callback])
: 停止写入数据,当参数被指定时,会先调用write
方法写入数据,之后触发finish
事件。
示例2:将数据写入文件
下面是一个将数据写入文件的例子:
const fs = require('fs');
const ws = fs.createWriteStream('output.txt');
ws.write('Hello, ');
ws.write('world!');
ws.end();
ws.on('finish', () => {
console.log('File writing is finished.');
});
上述代码中,我们使用 createWriteStream
方法创建了一个可写流,并指定要写入的目标文件是 output.txt
。之后,我们先使用 write
方法将数据写入缓存区中,然后通过 end
方法停止写入数据,并触发 finish
事件。在该事件的回调函数中,我们输出了文件写入完成的提示信息。
管道
管道是一种将可读流和可写流链接起来的方式,使得数据可以直接从可读流中流向可写流中,而不需要在中间创建额外的缓存区。
示例3:将文件中的数据写入另一个文件
下面是一个将文件中的数据写入另一个文件的例子:
const fs = require('fs');
const rs = fs.createReadStream('input.txt');
const ws = fs.createWriteStream('output.txt');
rs.pipe(ws);
ws.on('finish', () => {
console.log('Data has been piped.');
});
上述代码中,我们使用 createReadStream
方法创建了一个可读流,并指定要读取的源文件是 input.txt
,使用 createWriteStream
方法创建了一个可写流,并指定要写入的目标文件是 output.txt
。之后,我们使用 pipe
方法将可读流和可写流链接起来,直接将数据从 input.txt
中读取出来,以 chunk
的方式传递到 output.txt
中,这个过程中不需要借助额外的缓存区。在数据被写入 output.txt
文件之后,会触发 finish
事件,并输出提示信息。
总结
通过本文,我们学习了 Node 可读流和可写流的基本知识,包括了可读流的核心方法和示例,可写流的核心方法和示例,以及如何使用管道将两个流链接起来。对于低内存消耗和高效处理大文件来说,应用流实现数据处理是一种非常有效的方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node 可读流与可写流的运用详解 - Python技术站