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);