一文带你搞懂Node中的流
什么是流
在Node.js中,流(Stream)是一种处理数据的抽象接口,是在处理大量数据时一种更加高效、可读性更强的解决方案。
流的本质就是ReadStream和WriteStream,它可以分为读流和写流。
Readable
读流也就是Readable,它是一个抽象类,不能用它自己,需要继承它后才能用。Readable提供了一种读取数据的接口,具有以下特点:
- 只有数据流入缓存区时才会触发readable事件
- 可以通过设置highWaterMark参数来调整缓存区大小
- 可以手动推入数据到流中,使用push方法
Writable
写流也就是Writable,它是一个抽象类,不能用它自己,需要继承它后才能用。Writable提供了一种将数据写入流的接口,具有以下特点:
- 当write返回false时,表示缓存区写满了,需要等待可写事件触发时再继续写入
- 当调用end方法时,表示写完成,流进入可写完成状态
流的使用
创建Readable
创建一个读流,从文件中读取数据:
const fs = require('fs');
const readable = fs.createReadStream('input.txt');
读取数据
流读取数据需要监听一个readable事件,当有数据可读时,会触发该事件:
readable.on('readable', () => {
let chunk;
while ((chunk = readable.read()) !== null) {
console.log(`chunk: ${chunk}`);
}
});
在这个示例中,我们通过while循环调用read方法来获取数据,直到数据都被读完。因为数据被分成了一小块一小块,所以我们需要循环读取直到读完。
创建Writable
创建一个写流,将数据写入文件:
const fs = require('fs');
const writable = fs.createWriteStream('output.txt');
写入数据
流写入数据需要调用write方法,可以传入一个字符串或者一个Buffer对象:
writable.write('hello, world!');
写入完成后,需要调用end方法以表示数据写入完成:
writable.end();
结论
利用流来读写数据,可以极大优化内存使用效率。在大量处理数据的场景下,使用流是一种更加高效、可读性更强的解决方案。
示例1:流读取并写入数据
const fs = require('fs');
const readable = fs.createReadStream('input.txt');
const writable = fs.createWriteStream('output.txt');
readable.on('readable', () => {
let chunk;
while ((chunk = readable.read()) !== null) {
console.log(`chunk: ${chunk}`);
writable.write(chunk);
}
writable.end();
});
在这个示例中,我们从文件中读取数据,并通过写流将数据写入到'output.txt'文件中。
示例2:利用管道操作
管道是将一个可读流与一个可写流连接起来的一个机制。可以通过管道将一个文件的数据直接复制到另一个文件。这种方式能够帮助我们简化代码。
const fs = require('fs');
const readable = fs.createReadStream('input.txt');
const writable = fs.createWriteStream('output.txt');
readable.pipe(writable);
在这个示例中,我们通过利用管道的方式将'input.txt'文件中的数据直接复制到'output.txt'文件中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你搞懂Node中的流 - Python技术站