聊聊关于Node中的stream流
前言
在Node.js中,Stream是一种很重要的数据结构,常被用于处理大规模数据,尤其是在网络传输中。 它是一种抽象接口,用于处理流动的数据。不论是数据的来源(文件、网络),还是数据的处理方式(文本、二进制、压缩、加密), 都有着统一的处理方式和接口。Stream的应用特别广泛,包括网络上传输、日志系统的处理、音视频数据处理、数据库查询等等。
Stream的介绍
Node.js中的Stream是一个抽象接口,提供了对数据的读写操作。一个Stream可以理解为是一个抽象的数据源, 源源不断地按照一定规则产生数据,并且可以通过各种方式对其进行处理。比如,可以通过网络传输,从文件中读取,或者是通过压缩、加密等方式对数据进行处理。它可以让我们在处理文件时不需要一次性将文件全部读入内存中,一边读一边处理,从而节省内存空间,提供处理效率。
示例一:读取文件流
const fs=require('fs'); const readStream=fs.createReadStream('./test.txt', 'utf-8'); readStream.on('data', chunk=> { console.log(chunk); });
首先我们用fs模块中的createReadStream()方法读取test.txt文件,得到一个可读流readStream。下面通过readStream.on()方法监听data事件,每当可读流进入可读状态时,就会触发回调函数,回调函数中的chunk就是从可读流中读取到的数据块。
示例二:写入文件流
const fs=require('fs'); const writeStream=fs.createWriteStream('./output.txt', 'utf-8'); const writeData='Hello World!'; writeStream.write(writeData); writeStream.end(); writeStream.on('finish', ()=> { console.log('写入完成'); });
首先我们用fs的createWriteStream()函数创建一个可写流writeStream,指定输出文件为'./output.txt'。然后使用writeStream.write()方法向流中写入数据,最后关闭流,关闭后会触发finish事件。
Stream的类型
Node.js中的Stream类型有四种:Readable、Writable、Duplex、Transform。Readable和Writable分别处理输入和输出,而Duplex和Transform则可以同时处理输入和输出。 可以通过继承这些类来扩展自己的Stream。
示例三:使用Transform扩展Stream
const fs=require('fs'); const { Transform }=require('stream'); class UpperCase extends Transform { _transform(chunk, encoding, done) { this.push(chunk.toString().toUpperCase()); done(); } } const readStream=fs.createReadStream('./test.txt'); const upperCase=new UpperCase(); const writeStream=fs.createWriteStream('./output.txt'); readStream.pipe(upperCase).pipe(writeStream); writeStream.on('finish', ()=> { console.log('写入完成'); });
上述代码中改写了Transform类,将输入流中的内容全部转为大写后再输出。通过fs中的createReadStream()函数读取test.txt文件,然后创建一个UpperCase类继承自Transform,实现_transform()方法将文本内容全部转为大写。在后续的回调中,把readStream的流通过pipe()方法连接到uppercase的流,再把uppercase流通过pipe()方法连接到writeStream的流,从而实现对test.txt文件的读取转换与输出。
Stream的优点
Node.js中除了常规的数据传输方式,Stream提供了一种更加抽象的、基于事件驱动的方法来进行数据传输。它的处理方式与相关数据几乎没有任何耦合关系,可以进行多个异步事件的处理,处理效率显著高于同步读写方法,同时占用更少的内存资源。
总结
Stream是Node.js中非常重要的一个特性,可以让我们更高效地处理数据流和提高系统性能。它的应用非常广泛,主要应用于网络上传输、文件读写、日志处理、音视频编解码处理、数据库查询等等操作中。Stream有四种类型:Readable、Writable、Duplex、Transform,每个类型都有自己特别的作用,通过继承可以实现更多功能。Stream处理数据的方式与特定的数据格式无关,同样有助于程序处理大规模数据的情况下,节约内存空间,提高程序效率。