node.js之buffer缓冲区和stream流的用法

buffer

  • buffer是 Node.js 的一个类。JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
  • 在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。
  • buffer是二进制,但是呈现出来的是十六进制

创建buffer

  • node6.0之前创Buffer
new Buffer();
  • node6.0之后创Buffer
let buffer = Buffer.alloc(10);
console.log(buffer);  // <Buffer 00 00 00 00 00 00 00 00 00 00>
  • 通过字符串创建
let buffer = Buffer.from("大家好"); 
console.log(buffer);  // <Buffer e5 a4 a7 e5 ae b6 e5 a5 bd>
  • 通过数组创建
let buffer = Buffer.from([0xe5, 0xa4, 0xa7, 0xe5, 0xae, 0xb6, 0xe5, 0xa5, 0xbd]);
console.log(buffer);  // <Buffer e5 a4 a7 e5 ae b6 e5 a5 bd>
console.log(buffer.toString()); // 大家好

解决buffer乱码问题

  • concat方法
let buffer1 = Buffer.from([0xe5, 0xa4, 0xa7,0xe5,]);
let buffer2 = Buffer.from([0xae, 0xb6, 0xe5, 0xa5, 0xbd]);
console.log(buffer1.toString());  // 大�
console.log(buffer2.toString());   // ��好
// 通过concat连接两个buffer,解决乱码
let newbuffer = Buffer.concat([buffer1,buffer2]);
console.log(newbuffer.toString());  // 大家好
  • 引入string_decoder
let buffer1 = Buffer.from([0xe5, 0xa4, 0xa7,0xe5,]);
let buffer2 = Buffer.from([0xae, 0xb6, 0xe5, 0xa5, 0xbd]);
let {StringDecoder} = require("string_decoder");
let decoder = new StringDecoder();
let res1 = decoder.write(buffer1);
let res2 = decoder.write(buffer2);
console.log(res1);  // 大
console.log(res2);  // 家
// 通过将半截buffer存在来,再相加,避免乱码
console.log(res1+res2);  // 大家好

stream流

  • strem 流与数据处理方面密不可分
  • 创建读取流
const fs = require("fs");
let res = fs.readFileSync("1.txt");
console.log(res);  // <Buffer e6 88 91 e6 98 af 31 2e 74 78 74 e6 96 87 e4 bb b6>
console.log(res.toString());  // 我是1.txt文件
  • 创建写入流
let rs = fs.createReadStream("3.txt");
let ws = fs.createWriteStream("2.txt");
rs.pipe(ws);  // 通过pipe管道的方式将文件流写入2.txt
  • 防止内存溢出,将文件切割小份,会把数据分成64k小文件依次传输。主要用于上传和下载。
  • 先创建一个128kb的文件
const fs = require("fs");
let buffer = Buffer.alloc(128*1024);
fs.writeFile("128kb",buffer,err=>{
    if(err){
        return console.log(err);
    }
    console.log("写入成功");
})
  • 断点读取,流会把数据分成64kb的小文件传输;
const fs = require("fs");
let num = 0;
let str = "";
let rs = fs.createReadStream("128kb");
rs.on("data",chunk=>{
    num++;
    str += chunk;
    console.log(chunk);
    console.log(num);
})
// 流完成了;
rs.on("end",()=>{
    console.log('读取完成',str);
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值