Steam简介 Steam简介什么是流流式传输用于逐块数据块处理读取和写入数据而不完成整个读取或写入操作因此不会将所有数据保留在内存中优点非常适合处理大量数据例如视频之类的数据在内存无需将所有数据保留在内存中和时间方面更高效的处理方式无需等待直到所有数据都可用四种基本流类型Node.js的stream模块提供了基类、所有流都是EventEmitter的实例Readable 可读流我们可以从中读取消费数据的流数据来源 文件、网络请求、标准输入等示例:fs.createReadStream()、http.IncomingMesage.两种读取模式暂停模式和流动模式重要事件data、end、error、closeWritable 可写流我们可以写入的流数据目标文件、网络响应、标准输出等示例fs.createWriteStream()、http.ServerResponse;重要方法write()end();事件drainfinisherrorcloseDuplex 双工流同事可读可写、且读写通道独立示例:net.Socket (TCP socket)、tls.TLSSocket.Transform 转换流双工流的特例输出由输入经过转换得到必须实现_transform(chunk,encoding,callback)方法示例zlib.createGzip()压缩流cryto.createCipher()加密流。steams代码实践constfsrequire(fs);constserverrequire(http).createServer();server.on(request,(req,res){fs.readFile(test-file.txt,(err,data){if(err)console.log(err);res.end(data);});});server.listen(8000,127.0.0.1,(){console.log(Listening...);});上面的这段代码是传统的读取文件的方式不过这个文件数据量有点多所以会导致加载非常慢如果以这种方式来加载一个几百MB的大文件甚至可能导致内存崩溃逐块处理数据constreadablefs.createReadStream(test-file.txt);readable.on(data,(chunk){res.write(chunk);});readable.on(end,(){res.end();});优势低内存占用只需当前块再内存中。时间效率读取一块、处理一块、不需要等待全部数据就绪可组合:像水流一样连接输入、转换、输出注意流并不是在时间上打败readfile而是让服务更加健壮、响应更加灵敏、支持海量的文件管道pipe()pipe()方法constreadablefs.createReadStream(test-file.txt);readable.pipe(res);自动将可读流的数据传送到可写流并处理背压、关闭流等。**缺点**如果中间任一流传输出错管道不会自动销毁可能造成内存泄漏。因此 Node.js 10 引入了更健壮的pipeline。pipeline()推荐const{pipeline}require(stream/promises);// 或 stream.pipeline 配合回调awaitpipeline(fs.createReadStream(in.txt),zlib.createGzip(),fs.createWriteStream(out.gz));自动处理错误和背压。任一流传输出错时会正确地销毁所有流。支持回调或 Promise 两种形式Node 15 推荐stream/promises。