Buffer缓冲器
Buffer就是缓冲器的意思,这个类主要是内存用来处理原始二进制数据的。
我们知道,二进制是0和1表示的数据,比如1001这样的,但人们很难看懂这是什么意思,因此会提供一部“字典对照表”进行翻译,这个字典也叫字符集。
字符集有ascII、utf-8、gb2312、big5、ansi等等,而Buffer支持的字符集有:
'ascii' - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。
'utf8' - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。
'utf16le' - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。
'ucs2' - 'utf16le' 的别名。
'base64' - Base64 编码。当从字符串创建 Buffer 时,这种编码可接受“URL 与文件名安全字母表”。
'latin1' - 一种把 Buffer 编码成一字节编码的字符串的方式。
'binary' - 'latin1' 的别名。
'hex' - 将每个字节编码为两个十六进制字符。
下面看看具体使用。
1、初始化
我们看一下如何创建Buffer。6以上的版本中舍弃了new的方式,改用了alloc和from方法创建。
let buf = Buffer.alloc(5);//创建一个buffer对象
console.log(buf);//<Buffer 00 00 00 00 00>
let buf2 = Buffer.from([1,2,3])//创建Buffer,初始化为一个数组
console.log(buf2)//<Buffer 01 02 03>
let buf3 = Buffer.from(buf2)//传Buffer也是可以的
console.log(buf3)//<Buffer 01 02 03>
let buf4 = Buffer.from('hello','utf8') //传字符串也行
console.log(buf4)//<Buffer 68 65 6c 6c 6f>
2、写入缓冲器
let buf = Buffer.alloc(5);//创建一个buffer对象
buf.write('hi','utf8')
console.log(buf)//<Buffer 68 69 00 00 00>
3、读取缓冲器
let buf = Buffer.from('hi,你好')
console.log(buf.toString('utf8'))//hi,你好
4、拼接缓冲器
Buffer也可以拼接。
let buf1 = Buffer.from('你好')
let buf2 = Buffer.from(',我是')
let buf3 = Buffer.from('jack')
let buf = Buffer.concat([buf1,buf2,buf3])
console.log(buf.toString('utf8'))//你好,我是jack
Stream
我们知道,要读取一个二进制文件,一般是要先读到内存Buffer里面的,对小型文件来说没啥问题,但是对于音频、视频这样动辄几个G的大文件来说就行不通了,因为一下子就会被把内存撑死,也称为“爆仓”现象。
Buffer反正是不成的了,我们应该用一种部分传输(chunk)的方式来解决,这就引入了流的概念。
Stream最常用的有两种:可读流和可写流。
可读流:
let fs = require('fs')
let total = ''
let readableStream = fs.createReadStream('./test.txt')
readableStream.setEncoding('UTF8')
readableStream.on('data',(chunk)=>{
total += chunk
})
readableStream.on('end',()=>{
console.log(total)
})
readableStream.on('error',(err)=>{
console.log(err)
})
可写流:
let fs = require('fs')
let readableStream = fs.createReadStream('./test.txt')
let writableStream = fs.createWriteStream('./output.txt')
readableStream.setEncoding('UTF8')
readableStream.on('data',(chunk)=>{
writableStream.write(chunk)//写入文件
})
readableStream.on('end',()=>{
writableStream.end()//关闭写入流
})
readableStream.on('error',(err)=>{
console.log(err)
})
pipe
pipe就是管子的意思,在gulp中这个方法比较常见。
let fs = require('fs')
let readableStream = fs.createReadStream('./input.txt')
let writableStream = fs.createWriteStream('./output.txt')
if(readableStream.pipe(writableStream)){
console.log('文件复制成功')
}else {
console.log('文件复制失败')
}
网友评论