Buffer 缓冲区
--------------------------------------
什么是Buffer
Buffer是用来存储二进制数据的对象 但是结果以16进制的形式表示出来
# Buffer是一个类数组对象,不是数组
Buffer的作用
javascript能够处理字符串,对字符串进行一些操作,但是对于一些二进制数据就没法操作了。
buffer是用来处理二进制文件流和TCP流(http的底层协议)的文件缓存区,可以将二进制流和string进行相互转换
Buffer的特点
buffer对象里面存储的是字节,而不是字符串或者其他的数据类型 主要热点是用来操作字节的
Buffer是一个类数组对象
什么时候用到buffer
用到数据流的地方就会用到buffer(比如文件读取,http中post请求传递的数据)
创建一个buffer对象
var buf = Buffer(字符串);
将一个buffer对象转换为字符串
var str = buf.toString();
-----------------------------------------
流操作(stream) 一般代表文件读写操作
为什么要有流操作
如果读取或者写入一个比较大的文件如(音频或者视频一般为几个G左右),如果使用writeFile或者readFile来操作,非常容易使电脑内存"爆仓",因为电脑内存一般也就4G,8G左右
理想的方法应该是分多次对数据进行读写操作,不管文件有多大,只要时间允许,总会处理完成。这时后就需要有流操作了
什么是流
把一个文件比喻成一个水桶,文件里面的内容比作为水,我们用一根管子(pipe)连接两个桶使得水从一个桶流入另一个桶,这样就慢慢的实现了大文件的复制过程(也就是流的过程)。
从文件读取数据时,可以打开一个文件流,然后从文件流中不断地读取数据
var readStream = fs.createReadStream("文件名")
创建一个可读流
readStream.on('data',callback(chunk));
当有数据流出时自动触发data事件,数据存储在chunk中
readStream.on("end",callback)
当数据读取完毕后自动触发end事件
readStream.on("error",callback(err));
当读取发生错误的时候自动触发error事件
向文件写入数据时,只需要把数据不断地往文件流中写进去就可以了
var writeStream = fs.createWriteStream("文件名")
创建一个可写流
writeStream.write("写入内容");
向文件中写入内容 # 要写入多个内容,只需要不断调用这个函数就可以了
writeStream.end();
写入完成
# 流的过程是可以暂停和重启的
readStream.pause() 暂停可读流
readStream.resume() 继续可读流
writeStream.on("drain") 监听可写流完成后触发事件
stream.write(chunk) 返回一个布尔值 如果为true代表写入流完成,false代表未完成
#所有可以读取数据的流都继承自stream.Readable,所有可以写入的流都继承自stream.Writable
pipe(管道)
将可读流和可写流串联起来,一个Readable流和一个Writable流串起来后,所有的数据自动从Readable流进入Writable流,这种操作叫pipe,这样源文件的所有数据就自动写入到目标文件里了
# pipe自动调用了data,end等事件
# 创建一个可读流
var readStream = fs.createReadStream("文件名");
# 创建一个可压缩和解压流
var zilb = require("zlib");
var gzip = zlib.createGzip();
# 创建一个可写流
var writeStream = fs.createWriteStream("文件名");
# 通过中间管道进行压缩然后写入到可写流中
readStream.pipe(gzip).pipe(writeStream);
浙公网安备 33010602011771号