node中对于流文件的读取,定义 为什么
- 通过node 读取文件的是时候,分为两种方式,一种直接通过fs来读取,就是一次性将文件读取到内存里面,另一种就是通过流式读取,就是分治,把大文件,分为多段读取,对内存消耗,较低。
应用 流的主要场景在于,大文件处理的时候,如果等所有文件都处理完毕再去响应,太慢,因此采取流式传输会更快一些,但是怎么知道传输完毕了,通过0块,以及对应contentLength来确定
分类 在node中,所有流一共就4种,分别为可读流,可写流,全双工流,转换流
import stream from 'node:stream';
// 可读流
const Readable = stream.Readable;
// 可写流
const Writable = stream.Writable;
// 双工流
const Duplex = stream.Duplex;
// 转换流
const Transform = stream.Transform;
具体原理
- 可读流,其实就是_read方法的具体实现
import { Readable } from 'node:stream';
const readableStream = new Readable();
readableStream._read = function () {
this.push('阿门阿前一棵葡萄树,');
this.push('阿东阿东绿的刚发芽,');
this.push('阿东背着那重重的的壳呀,');
this.push('一步一步地往上爬。')
this.push(null);
}
readableStream.on('data', (data) => {
console.log(data.toString())
});
readableStream.on('end', () => {
console.log('done');
});
- 可写流,其实是_write的具体实现
import { Writable } from 'node:stream';
class WritableDong extends Writable {
constructor(iterator) {
super();
this.iterator = iterator;
}
_write(data, enc, next) {
console.log(data.toString());
setTimeout(() => {
next();
}, 1000);
}
}
function createWriteStream() {
return new WritableDong();
}
const writeStream = createWriteStream();
writeStream.on('finish', () => console.log('done'));
writeStream.write('阿门阿前一棵葡萄树,');
writeStream.write('阿东阿东绿的刚发芽,');
writeStream.write('阿东背着那重重的的壳呀,');
writeStream.write('一步一步地往上爬。');
writeStream.end();
具体的使用
- fs.createReadStream 是可读流 readAble的具体实现
- fs.wtrteStream 是可写流writeable的具体实现
- duplex 双工流,socket是具体实现
- transform 是基于双工流进行内容转换,createGzip压缩(压缩势必涉及文件内容转换,压缩)具体实现