stream 是 Node.js 提供的又一个仅在服务器端可用的模块,目的是支持”流”这种数据结构。

流 :

  • 输入流 (stdin)
  • 输出流(stdout)

    流的特点:

    流的数据是有序的,而且必须依次读取,或者依次写入,不能像Array那样随机定位。

在 Node.js 中流是一个对象,我们只需要响应流的事件就可以了, data 事件表示流的数据已经可以读取了,end 事件表示这个流已经到末尾了,么有数据可以读取了,error 事件表示出错了。

读取文件

  1. "use strict";
  2. var fs = require("fs");
  3. var path = require("path");
  4. var rs = fs.createReadStream(path.resolve(__dirname, "test.txt"), "utf-8");
  5. rs.on("data", function(chunk) {
  6. console.log("Start Red");
  7. console.log("chunk--", chunk);
  8. });
  9. rs.on("end", function() {
  10. console.log("End");
  11. });
  12. rs.on("error", function(err) {
  13. console.log("err--", err);
  14. });

data 事件可能会触发多次,每次传递的 chunk 是流的一部分数据。

写如文件

  1. "use strict";
  2. var fs = require("fs");
  3. var path = require("path");
  4. var ws = fs.createWriteStream(path.resolve(__dirname, "sample.txt"), "utf-8");
  5. ws.write("开始写了");
  6. ws.write("写完了, END");
  7. ws.end();
  8. // ------------------------分割线---------------------------
  9. var ws2 = fs.createWriteStream(path.resolve(__dirname, "sample.txt"));
  10. ws2.write(Buffer.from("开始写了 ....\n"), 'utf-8');
  11. ws2.write(Buffer.from("写完了, END"), 'utf-8');
  12. ws2.end();

如果当前目录下没有将要写入的文件,会新建一个文件,并写入数据。

pipe(管道)

可以将两个流串起来,就像可以把两个水管串成一个更长的水管一样。 一个 Readable 流 和一个 Writeable 流串起来后,所有的数据自动从 Readable 流进入 Writeable 流,这种操作叫做 pipe

实现复制文件的程序

  1. "use strict";
  2. var fs = require("fs");
  3. var path = require("path");
  4. var rs = fs.createReadStream(path.resolve(__dirname, 'sample.txt'));
  5. var ws = fs.createWriteStream(path.resolve(__dirname, 'copied.txt'));
  6. rs.pipe(ws);

默认情况下,当Readable 流的数据读取完毕后, end 事件触发后,将关闭 Writeable 流。如果我们不希望自动关闭Writeable 流,需要传入参数:

  1. readable.pipe(writeable, {end: false})