stream数据流

首先必须先要了解Buffer,Buffer是js和c++的结合体,类数组,通常与Stream一起用:

1.

(1).Buffer是个类,因此可以构建成对象

(2).buf具有数组的性质

字符串转换成二进制:

(1)通常用Buffer来构建二进制

    new Buffer(string,[encodding])  默认是utf-8  //中文一个字是3个字节

    buf对象之间的encodding相互转换

    buf.write(string,[encodding])

(2)buf转为字符串

    buf.toString([encodding]) 

    buf += chunk   //这是一种默认的转换,会将二进制转为字符串,默认是utf-8

    因为buf在转换成string时,中文是3个字节,如果不是宽字节编码时,就会截断一部分buf,造成乱码

(3)buffer的拼接(buffer的应用中一般是一段一段的传输的),一般用在两种情况下

     (1) var rs = fs.createReadStream()

           rs的data事件,是一段一段读的

          rs.on('data',function(chunk){})

     (2)网络请求中,res.on('data',function(chunk){})

 

    拼接中用: 

  var rs = fs.createReadStream('./test.txt');
  var chunks = [];
  rs.on('data', function (chunk) {
    chunks.push(chunk);
  });
  rs.on('end', function () {
    var buf = Buffer.concat(chunks);
    var str = buf.toString()
  });

(4)对文件读取时以及网络请求的优化

      (1)网络中优化

          node可以将静态的文件转换成二进制的内容,将二进制的内容返回,可将性能大幅度提高.

          同时将二进制采用zlib进行压缩

      (2)文件读取的优化

           fs.readFile与fs.createReadStream的区别:

       fs.readFile是一次将读取的内容存到内存中

      fs.createReadStream是从磁盘中读一点,放到内存中,先在内存中准备一段Buffer,然后调用fs.read()读取时逐步复制到Buffer中.因此调用fs.read()则调用一次磁盘读取.

        fs.createReadStream(path,opts)       其中:highWaterMark设置为64*1024这样可保证速度

         // 创建一个可读流
         var readerStream = fs.createReadStream('input.txt');

        // 创建一个可写流
         var writerStream = fs.createWriteStream('output.txt');

       // 管道读写操作
       // 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
       readerStream.pipe(writerStream);

(5)采用压缩,判断压缩类型:                 

 

                 

posted @ 2016-12-28 14:03  jay-  阅读(311)  评论(0编辑  收藏  举报