Buffer是用来保存原始数据
流是用来暂存和移动数据的
通常是结合起来使用
还是复制一张图片
var fs = require('fs')
var source = fs.readFileSync('../buffer/timg.jpeg')
fs.writeFileSync('stream_copy_timg.jpeg', source)
在node中node 文件名.js 就可以实现一张图片的复制
会不会这样的操作太简单暴力了,没办法精确的控制数据在流里面的传输,这个不用担心,stream是根据事件机制工作的,这就意味着在流对象上具有异步操作的特征,可以触发事件,监听事件,也就是说流在各个阶段的事件我们都可以监听。为了有更直观的认识,我们还是上一段代码:
//加载文件系统模块
var fs = require('fs')
//加载一个可读的流,读取js文件
var readStream = fs.createReadStream('stream_copy_logo.js')
//声明一个计数器
var n = 0
readStream
//数据正在传递时触发data事件
.on('data', function(chunk) {
n++
console.log('data emits')
//验证流是以buffer传递
console.log(Buffer.isBuffer(chunk))
//打印文件内容
console.log(chunk.toString('utf8'))
//暂停流
readStream.pause()
console.log('data pause')
//模拟一个异步处理
setTimeout(function() {
console.log('data pause end')
//从新启动数据传递
readStream.resume()
}, 3000)
})
//文件是可读的
.on('readable', function() {
console.log('data readable')
})
//数据完成传递完成后触发
.on('end', function() {
console.log(n)
console.log('data ends')
})
//整个流传输结束关闭是触发
.on('close', function() {
console.log('data close')
})
//读取出错触发
.on('error', function() {
console.log('data read error' + e)
})
在控制台打印出来
我们通过看n的数值乐意了解到一共接受了多少次数据
上面是对进行读取一个文件,接下来是边读边写
//加载文件模块
var fs = require('fs')
//创建一个刻度流
var readStream = fs.createReadStream('stream_copy_timg.jpeg')
//创建一个写入流
var writeStream = fs.createWriteStream('timg-stream.jpeg')
//触发data事件,绑定监听函数
readStream.on('data', function(chunk) {
//判断数据是否写入,如果没写入,还在缓存取,就让读的速度慢点
if(writeStream.write(chunk) === false) {
console.log('stil cached')
//读取先暂停
readStream.pause()
}
})
//数据读取完毕,关闭数据流,end方法
readStream.on('end', function() {
writeStream.end()
})
//数据应尽写入到目标了
writeStream.on('drain', function(){
console.log('data drains')
//可以继续读了
readStream.resume()
})
在控制台node 文件名.js
我们可以看到这样的信息
说明文件在不停的读 不停的写