持续创作,加速成长!这是我参与「掘金日新计划 · 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二进制数据,并且有一行警告,这是我们的写法不推荐的问题
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进制就代表一个字符,空格也算
highWaterMark内部缓冲区最多能容纳的字节数,现在是10k,如果超过这个大小,就停止读取资源文件,默认值是64KB。
假设文件大小为100KB,那么在默认情况下,系统就会每次从文件里读取64KB大小的数据,随后触发data事件;chunk的大小即为highWaterMark的大小;然后接着读取36KB大小的文件,再次触发data事件;随后文件读取结束,触发end事件--《新时期的Node.js入门》
我们可以来看下实践,我们将node.txt复制字节增加到2k,把highWaterMark设置为10,
把highWaterMark设置为1