区别

普通操作 readFile 与 writeFile 是一下将数据读取到内存中在进行操作,占用内存空间大
流式操作 对占用内存空间下 且速度比普通操作快,使用是大数据时使用

代码

  1. const fs = require("fs");
  2. const path = require("path");
  3. //方式1 普通操作
  4. async function method1() {
  5. const from = path.resolve(__dirname, "./temp/abc.txt");
  6. const to = path.resolve(__dirname, "./temp/abc2.txt");
  7. console.time("方式1");
  8. const content = await fs.promises.readFile(from);
  9. await fs.promises.writeFile(to, content);
  10. console.timeEnd("方式1"); // 10m数据用啦90.549ms
  11. console.log("复制完成");
  12. }
  13. //方式2 使用流
  14. async function method2() {
  15. const from = path.resolve(__dirname, "./temp/abc.txt");
  16. const to = path.resolve(__dirname, "./temp/abc2.txt");
  17. console.time("方式2");
  18. const rs = fs.createReadStream(from);
  19. const ws = fs.createWriteStream(to);
  20. rs.on("data", chunk => {
  21. //读到一部分数据
  22. const flag = ws.write(chunk);
  23. if (!flag) {
  24. //表示下一次写入,会造成背压
  25. rs.pause(); //暂停读取
  26. }
  27. });
  28. ws.on("drain", () => {
  29. //可以继续写了
  30. rs.resume();
  31. });
  32. rs.on("close", () => {
  33. //写完了
  34. ws.end(); //完毕写入流
  35. console.timeEnd("方式2"); // 10m数据使用啦36.088ms 操作大数据是建议使用流,速度快占用内存少
  36. console.log("复制完成");
  37. });
  38. }
  39. method2();