11慕课网《进击Node.js基础(一)》Buffer和Stream
Buffer
用来保存原始数据
(logo.png)
以下代码读取logo.png为buffer类型
然后将buffer转化为string,新建png
可以将字符串配置: data:image/png;Base64,Buffer.toString()
var fs = require('fs')
fs.readFile('logo.png',function(err,origin_buffer){
console.log('origin_buffer是否Buffer格式:'+Buffer.isBuffer(origin_buffer))
//console.log('读取到origin_buffer:' + origin_buffer)
//创建文件
fs.writeFile('log_buffer.png',origin_buffer,function(err){
if(err) console.log(err)
})
//var base84Image = new Buffer(origin_buffer).toString('base64')
//转为字符串
var base64Image = origin_buffer.toString('base64')
console.log('字符串base64Image:' + base64Image)
var decodedImage = new Buffer(base64Image, 'base64')
//console.log('编码decodedImage:'+decodedImage)
//console.log('比较origin_buffer和decodedImage:' + Buffer.compare(origin_buffer,decodedImage))
fs.writeFile('logo_decoded.png',decodedImage,function(err){
if(err) console.log(err)
})
})
Stream
暂存和移动数据
通过stream直接copy图片
var fs = require('fs')
var source = fs.readFileSync('../buffer/logo.png')
fs.writeFileSync('stream_copy.png',source)
stream读操作触发事件
stream的读取会触发事件,通过监听可以实现许多功能
stream事件每次传输 64kb
var fs = require('fs')
var readStream = fs.createReadStream('xpg.mp3')
var n=0
//数据传递过程中触发,监听data事件
readStream
.on('data', function(chunk){
n++
console.log('data emits')
console.log('是否以Buffer格式传递?:'+Buffer.isBuffer(chunk))
//console.log(chunk.toString('utf8'))
//
readStream.pause()//暂停
console.log('data pause')
setTimeout(function(){
console.log('data pause end')
readStream.resume()//重新启动
},10)
})
.on('readable',function(){
//文件可读
console.log('data readable')
})
.on('end', function(){
console.log(n)
//数据传递事件,同时触发目标不可写
console.log('data end')
})
.on('close',function(){
//整个stream关闭结束
console.log('data close')
})
.on('error',function(e){
console.log('data read error'+e)
})

stream的读写
//文件copy
var fs = require('fs')
var readStream = fs.createReadStream('xpg.mp3')
var writeStream = fs.createWriteStream('copy-xpg.mp3')
readStream.on('data',function(chunk){
//数据还在缓冲区,未写完
if(writeStream.write(chunk) === false){
console.log('still cached')
//暂停读入,防止缓冲区爆掉
readStream.pause()
}
})
readStream.on('end',function(){
writeStream.end()
})
//drain方法,数据被消费完,全部写入目标
writeStream.on('drain', function(){
console.log('data drain')
//重新启动读操作
readStream.resume()
})

Stream种类
- Readable 可读流,读取外部数据,将数据缓冲到内部的buffer数组
- Writeable 可写流,消费buffer数组中的数据,写目标
- Duplex 双工流
- Transform 转换、双工
使用pipe
var http = require('http')
var fs = require('fs')
//需要安装 npm install request
var request = require('request')
http
.createServer(function(req,res){
//通俗的做法
// fs.readFile('../buffer/logo.png', function(err,data){
// if(err){
// res.end('file not exist!')
// }else{
// res.writeHeader(200,{'Context-Type':'text/html'})
// res.end(data)
// }
// })
//简洁的方案
//fs.createReadStream('../buffer/logo.png').pipe(res)
//爬取网络中的图片
request('http://img2.mukewang.com/szimg/5a67ebf50001b6d005400300-228-128.jpg')
.pipe(res)
})
.listen(8090)
console.log('run on 8090')
使用pipe重写stream的直接读写
var fs = require('fs')
fs.createReadStream('xpg.mp3').pipe(fs.createWriteStream('xpg-pipe.mp3'))
pipe连接Readable和Writabel
//文件copy
var fs = require('fs')
var readStream = fs.createReadStream('xpg.mp3')
var writeStream = fs.createWriteStream('copy-xpg.mp3')
readStream.on('data',function(chunk){
//数据还在缓冲区,未写完
if(writeStream.write(chunk) === false){
console.log('still cached')
//暂停读入,防止缓冲区爆掉
readStream.pause()
}
})
readStream.on('end',function(){
writeStream.end()
})
//drain方法,数据被消费完,全部写入目标
writeStream.on('drain', function(){
console.log('data drain')
//重新启动读操作
readStream.resume()
})

自己定制的Readable Write
var stream = require('stream')
var util = require('util')
//定制可读流
function ReadStream(){
stream.Readable.call(this)
}
//使ReadStream 继承stream.Readable的原型
util.inherits(ReadStream,stream.Readable)
ReadStream.prototype._read = function(){
this.push('I')
this.push('Love')
this.push('You')
//null结束
this.push(null)
}
//===定制可写流
function WriteStream(){
stream.Writable.call(this)
this._cached = new Buffer('')
}
util.inherits(WriteStream,stream.Writable)
WriteStream.prototype._write = function(chunk, encode, cb){
console.log(chunk.toString())
cb()
}
//定制转换流
function TransformStream(){
stream.Transform.call(this)
}
util.inherits(TransformStream,stream.Transform)
TransformStream.prototype._transform = function(chunk, encode, cb){
this.push(chunk)
cb()
}
TransformStream.prototype._flush = function(cb){
this.push('OK')
cb()
}
var rs = new ReadStream()
var ws = new WriteStream()
var ts = new TransformStream()
rs.pipe(ts).pipe(ws)

11慕课网《进击Node.js基础(一)》Buffer和Stream的更多相关文章
- 01慕课网《进击Node.js基础(一)》Node.js安装,创建例子
版本:偶数位为稳定版本,基数为非稳定版本 - 0.6.x - 0.7.x - 0.8.x -0.9.x -0.10.x -0.11.x 概念:Node.js采用谷歌浏览器的V8引擎,用C ...
- 03慕课网《进击Node.js基础(一)》API-URL网址解析
url url.parse(url,query,host);解析域名 url必须,地址字符串 query可选 host 可选:在不清楚协议时正确解析 querystring 字符串和对象之间互相解析 ...
- 10慕课网《进击Node.js基础(一)》初识promise
首先用最简单的方式实现一个动画效果 <!doctype> <html> <head> <title>Promise animation</titl ...
- 07慕课网《进击Node.js基础(一)》HTTP小爬虫
获取HTML页面 var http = require('http') var url='http://www.imooc.com/learn/348' http.get(url,function(r ...
- 进击Node.js基础(二)
一.一个牛逼闪闪的知识点Promise npm install bluebird 二.Promise实例 ball.html <!doctype> <!DOCTYPE html> ...
- 02慕课网《进击Node.js基础(一)》——CommonJs标准
是一套规范管理模块 每个js 为一个模块,多个模块作为一个包 node.js和Couchdb是对其的实现: 不同于jQuery 模块:定义.标识.引用(地址/模块名称) 模块类型: 核心模块http ...
- 进击Node.js基础(一)
一.前言 1:Node.js本质上是用chrome浏览器 v8引擎 使用c++编写的JS运行环境 2:相比于JS没有浏览器安全级的限制,额外提供了一些系统级的API:文件读写,进程管理,网络通信等. ...
- 04慕课网《进击Node.js基础(一)》HTTP讲解
HTTP:通信协议 流程概述: http客户端发起请求,创建端口默认8080 http服务器在端口监听客户端请求 http服务器向客户端返回状态和内容 稍微详细解析: 1.域名解析:浏览器搜素自身的D ...
- 09慕课网《进击Node.js基础(一)》HTTP-get/request
get是对request封装 可以在后台发起http请求,获取远程资源,更新或者同步远程资源 http.request(options[,callback]) 以下代码灌水失败: var http = ...
随机推荐
- 难度并不NOIP的NOIP模拟赛
今天老师请了前几届的学长来讲课,可是讲课为什么要考试呢... 学长说难度是NOIP,于是我就naive的跟着参加了,然而T3难度并不友好,感觉确实不是很适合我们现在做......不过课本来也不是给我们 ...
- 微信发红包 PHP 实现
最近做生日营销,需要微信发红包,特此从网上找了一篇教程 首先你的有个服务号,并且开通了微信支付,我在这就不说怎么去申请和开通了,我是看了微信官方文档后,想看官方文档的朋友可以到下面这个链接 https ...
- 【题解】[HNOI2008]神奇的国度—BZOJ1006。
之前说顺着打BZOJ结果又被自己给鸽了qwq. ------------------------------------ 言归正传这道题应该怎么做. 先给大家普及一下弦图(连接环上俩个不相邻节点的边称 ...
- solr的随机排序 【转载】
原文地址:http://blog.csdn.net/duck_genuine/article/details/8477336 有这样的一种需求,想从索引库里随机取出4条记录. 在 schema.xml ...
- 利用 Settings Sync 同步vs code配置
vs code上有各种各样不同的插件,如果要在不同的电脑上使用 vs code 配置是件比较麻烦的事情,使用 Settings Sync 将 vs code 配置备份起来,当需要在其他电脑使用 vs ...
- pyspider爬取数据存入es--1.安装驱动
跟使用mysql一样,不安装es驱动的话,也会触发模块找不到的错误 ImportError: No module named elasticsearch 通过pip安装 pip install ela ...
- JSP中使用JDBC连接MySQL数据库的详细步骤
1,首先在自己新建的项目文本框中输入Web Project的名称,然后单击下一步. 2,继续单击下一步 3,把Generate web.xml deployment descriptor复选框勾上. ...
- 理解C#的Lock语法意义
一. 为什么要lock,lock了什么? 当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待.但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当 ...
- linux 文件夹和文件操作
1.统计目录有多少个文件数 find ./company -type f | wc -l 2.删除文件夹中的文件 rm -f * #最经典的方法,删除当前目录下的所有类型的文件 rsync --del ...
- 第16章 STM32中断应用概览
第16章 STM32中断应用概览 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...