stream是 Node.js 提供的又一个仅在服务器端可用的模块,目的是支持”流”这种数据结构。
流 :
在 Node.js 中流是一个对象,我们只需要响应流的事件就可以了, data 事件表示流的数据已经可以读取了,end 事件表示这个流已经到末尾了,么有数据可以读取了,error 事件表示出错了。
读取文件
"use strict";var fs = require("fs");var path = require("path");var rs = fs.createReadStream(path.resolve(__dirname, "test.txt"), "utf-8");rs.on("data", function(chunk) {console.log("Start Red");console.log("chunk--", chunk);});rs.on("end", function() {console.log("End");});rs.on("error", function(err) {console.log("err--", err);});
data 事件可能会触发多次,每次传递的 chunk 是流的一部分数据。
写如文件
"use strict";var fs = require("fs");var path = require("path");var ws = fs.createWriteStream(path.resolve(__dirname, "sample.txt"), "utf-8");ws.write("开始写了");ws.write("写完了, END");ws.end();// ------------------------分割线---------------------------var ws2 = fs.createWriteStream(path.resolve(__dirname, "sample.txt"));ws2.write(Buffer.from("开始写了 ....\n"), 'utf-8');ws2.write(Buffer.from("写完了, END"), 'utf-8');ws2.end();
如果当前目录下没有将要写入的文件,会新建一个文件,并写入数据。
pipe(管道)
可以将两个流串起来,就像可以把两个水管串成一个更长的水管一样。 一个
Readable流 和一个Writeable流串起来后,所有的数据自动从Readable流进入Writeable流,这种操作叫做 pipe
实现复制文件的程序
"use strict";var fs = require("fs");var path = require("path");var rs = fs.createReadStream(path.resolve(__dirname, 'sample.txt'));var ws = fs.createWriteStream(path.resolve(__dirname, 'copied.txt'));rs.pipe(ws);
默认情况下,当Readable 流的数据读取完毕后, end 事件触发后,将关闭 Writeable 流。如果我们不希望自动关闭Writeable 流,需要传入参数:
readable.pipe(writeable, {end: false})
