Node.js Stream 学习笔记
什么是Stream
Stream 是 Node.js 中处理流式数据的抽象接口,Stream 的核心在于将数据分成各个小块,逐个处理这些小块,避免一次性加载大量数据造成内存占用过高的问题。
Node.js 的 Stream 接口分为四种基本类型:可读流(Readable)、可写流(Writable)、可读可写流(Duplex)、转换流(Transform)。
可读流(Readable)
可读流对象就是读取数据的源头,常见的有文件可读流、HTTP 响应可读流等。
可读流的常用属性和方法:
readable.read([size])
:从可读流读取指定大小的数据,默认为读取全部数据。readable.pipe(destination[, options])
:将可读流中的数据通过管道传输到可写流中。readable.pause()
和readable.resume()
:暂停和恢复读取数据。
Demo:
javascriptCopy Codeconst fs = require('fs');
const readableStream = fs.createReadStream('./example.txt', { encoding: 'utf8' });
readableStream.on('data', (chunk) => {
console.log(chunk);
});
readableStream.on('end', () => {
console.log('读取结束');
});
可写流(Writable)
可写流对象就是写入数据的目标,常见的有文件可写流、HTTP 请求可写流等。
可写流的常用属性和方法:
writable.write(chunk[, encoding][, callback])
:将数据写入到可写流中。writable.end([chunk[, encoding]][, callback])
:写入完成后结束可写流。writable.destroy()
和writable.destroySoon()
:销毁可写流。
Demo:
javascriptCopy Codeconst fs = require('fs');
const writableStream = fs.createWriteStream('./example.txt', { encoding: 'utf8' });
writableStream.write('Hello ');
writableStream.write('World!');
writableStream.end();
可读可写流(Duplex)
可读可写流对象既可以读数据也可以写数据,常见的有 TCP 套接字、Gzip 压缩流等。
可读可写流继承了可读流和可写流的所有属性和方法。
转换流(Transform)
转换流对象是一种特殊的 Duplex 流对象,它可以对数据进行转换处理,常见的有 Gzip 压缩流、加密流等。
转换流继承了 Duplex 流的所有属性和方法,并添加了额外的 _transform()
和 _flush()
方法来实现数据的转换。
Stream 的使用场景
Stream 是 Node.js 中非常重要的模块,它在许多场景中都得到了广泛应用,比如:
- 在 HTTP 服务中,利用 Stream 可以异步地将 HTML 文件一行一行发送给客户端。
- 在前端开发中,可以使用 Stream 处理大型图片或视频文件。
- 在爬虫开发中,利用 Stream 可以大幅度减少内存使用量,提高性能。
- 在日志处理中,可以使用 Stream 逐行读取日志文件并进行分析。