Node内的Buffer和Stream
Posted 还是不会呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node内的Buffer和Stream相关的知识,希望对你有一定的参考价值。
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)