Node内的Buffer和Stream

Posted 还是不会呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node内的Buffer和Stream相关的知识,希望对你有一定的参考价值。

邂逅Buffer

计算机中的数据都是用二进制来保存的,NodeJS用来开发服务端,就必须具备处理二进制数据的能力,通过Buffer可以操作数据字节。

字符串存储到Buffer中

创建Buffer实例的方式

Buffer实例就类似与一个数组,可以利用下标获取对应位置的字节。

const buffer1 = new Buffer("hello"); // 此方法已经过期
console.log(buffer1); // <Buffer 68 65 6c 6c 6f>

const buffer2 = Buffer.from("hello");
console.log(buffer2); // <Buffer 68 65 6c 6c 6f>

const buffer3 = Buffer.alloc(5);
console.log(buffer3); // <Buffer 00 00 00 00 00>

Buffer的编码的解码

/**
 * toString()方法默认解码: utf-8格式的编码
 * Buffer.from() 第二个参数为编码的方式
 * 对于英文来说:下方两种格式不使用对于解码方式没有影响
 * 对于中文来说:什么编码方式就用什么解码方式
 */
const buffer1 = Buffer.from("abc");
console.log(buffer1.toString()); // abc

const buffer2 = Buffer.from("abc", "utf16le");
console.log(buffer2.toString()); // abc

const buffer3 = Buffer.from("你好");
console.log(buffer3.toString()); // 你好

const buffer4 = Buffer.from("你好", "utf16le");
console.log(buffer4.toString()); // `O}Y

const buffer5 = Buffer.from("你好", "utf16le");
console.log(buffer5.toString("utf16le")); // 你好

Buffer和文件读写的结合

const fs = require("fs");
// 不传对应的配置 { encoding: "utf-8" } 其实返回的就是字节流
fs.readFile("./abc.txt", (err, data) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log(data); // <Buffer 48 65 6c 6c 6f 20 4e 6f 64 65 4a 53 21>
  // writeFile写文件写入的内容 也可以接收 buffer
  fs.writeFile("./xyz.txt", data, (err) => {
    console.log(err);
  });
});

邂逅Stream

对于之前的写文件和读文件操作,都是一次性读取,一次性的操作(对于很大的文件这种方法是不可取的),无法对其进行精准的操作。

比如:从那个字节开始读取,读多少位,什么时候结束。

Stream(流)可以帮进行控制

所有的流都是EventEmitter的实例

读取流

更多详细配置,移步官方文档

const fs = require("fs");

// 返回一个 fs.ReadStream 实例,
const readStream = fs.createReadStream("./abc.txt", {
  start: 5, // 从第五个字节开始读取
  end: Infinity, // Infinity无穷的,默认值
  highWaterMark: 2, // 每次读取2个字节
});
// 监听data事件 读取到字节开始回调
readStream.on("data", (res) => {
  console.log(res);
  readStream.pause(); // 暂停读取
  setTimeout(() => {
    readStream.resume(); // 回复读取
  }, 1000);
});
// 监听到文件打开事件
readStream.on("open", () => {
  console.log("文件打开,开始读取~");
});
// 默认读取完文件是会自动帮助关闭文件,发出"close"事件
readStream.on("close", () => {
  console.log("文件关闭,读取完成~");
});

写入流

更多详细配置,移步官方文档

const fs = require("fs");
// ./abc.txt 文件内容: Hello NodeJS!
const writeStream = fs.createWriteStream("./abc.txt", {
  flags: "r+",
  start: 4,
});

writeStream.write("你好呀");
writeStream.write(" coderbin");
// ./abc.txt 文件内容: Hell你好呀 coderbin

// 监听文件关闭
writeStream.on("close", () => {
  console.log("文件写入完成~");
});

//方法一: 文件是不会自动关闭的,需要写入数据完成后,调用关闭方法
writeStream.close(); // 文件写入完成~

// 方法二:调用end方法
// writeStream.end("最后插入的内容~");
/**
 *  writeStream.end("最后插入的内容~"); 相当于下方代码
 *  writeStream.write("最后插入的内容~");
 *  writeStream.close();
 */

pipe方法

输入输出流结合使用,将一个流的内如输入到另一个流中。

const fs = require("fs");

const readStream = fs.createReadStream("./abc.txt");
const writeStream = fs.createWriteStream("./foo.txt");
readStream.on("data", (res) => {
  console.log(res);
});

readStream.pipe(writeStream);

readStream.on("close", () => {
  writeStream.close();
});

以上是关于Node内的Buffer和Stream的主要内容,如果未能解决你的问题,请参考以下文章

Node.js实战对于Buffer和Stream模块系统的深入剖析

node.js Stream Buffer FsPromise

Node.js之文件及文件流(fs,path,buffer,stream)

从Node.js Stream写入多个文件

Java I/O 中的“Stream”和“Buffer”到底是啥意思?

201902161119_《Node.js之流(Stream)一二事》