Node.js入门笔记(3):了解一下Buffer吧

238 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

1.Buffer

Buffer是Node特有(区别于浏览器JavaScript)的数据类型,主要用来处理二进制数据,在前端JavaScript中,和二进制数据打交道的机会比较少(ES2015增加了ArrayBuffer类型,用来操作二进制数据流,Node也可以使用该类型,我们会在下一章介绍)。而Node在进行Web开发时经常需要和前端进行数据通信,二进制数据流十分常见(例如传输一张gif图片),因此Node除了String外,还内置了Buffer这一数据类型,它是Node作为运行时对JavaScript做的扩展。

1.Buffer使用

读取文件

const fs = require('fs');
fs.readFile('./node.txt',function(err,res){
    console.log(res);
})

小白同学可能会问,第一行的fs是什么?

fs(file system),该模块提供本地文件的读写能力,所有与文件的操作都是通过fs核心模块实现

<Buffer 68 65 6c 6c 6f 20 6e 6f 64 65>

控制台打印了文件转换成Buffer类型的数据,使用的是十六进制的字符串,因为纯二进制太长啦。

Buffer的构建与转换

1.由字符串来得到一个Buffer 字符串-->Buffer

const buf = new Buffer('hello node')
console.log(buf);

我们可以看到输出了字符串的buffer二进制数据,并且有一行警告,这是我们的写法不推荐的问题 image.png

const buf =  Buffer.from('hello node')
console.log(buf);

2.由Buffer来得到一个字符串 Buffer-->字符串

const buf =  Buffer.from([0x48,0x65,0x6c,0x6c,0x6f,0x20,0x4e,0x6f,0x64,0x65])
console.log(buf.toString("utf-8"));//Hello Node

Buffer-->base64

const buf =  Buffer.from([0x48,0x65,0x6c,0x6c,0x6f,0x20,0x4e,0x6f,0x64,0x65])
console.log(buf.toString("base64"));//SGVsbG8gTm9kZQ==

Buffer的拼接

Buffer一个常见的使用场景是用来处理HTTP的post请求

下面实现拼接上传的数据流

const fs = require('fs').createReadStream('./node.txt',{highWaterMark:10})
let data1 = []
fs.on('data',function(chunk){
    console.log(chunk);
    data1.push(chunk)
})
fs.on('end',function(){
    let buf = Buffer.concat(data1)
    console.log(buf.toString());
})

这里每一个16进制就代表一个字符,空格也算 image.png highWaterMark内部缓冲区最多能容纳的字节数,现在是10k,如果超过这个大小,就停止读取资源文件,默认值是64KB。

假设文件大小为100KB,那么在默认情况下,系统就会每次从文件里读取64KB大小的数据,随后触发data事件;chunk的大小即为highWaterMark的大小;然后接着读取36KB大小的文件,再次触发data事件;随后文件读取结束,触发end事件--《新时期的Node.js入门》

我们可以来看下实践,我们将node.txt复制字节增加到2k,把highWaterMark设置为10,

image.png

把highWaterMark设置为1

image.png