c语言编程笔录

您现在的位置是:首页 > 编程 > 编程经验

编程经验

聊聊关于Node中的stream流

李肇芬 2023-07-10编程经验
前言在Node.js中,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处理数据的方式与特定的数据格式无关,同样有助于程序处理大规模数据的情况下,节约内存空间,提高程序效率。

文章评论