Nodejs学习笔记(二)--流的操作

1、读取流
var readStream = fs.createReadStream(“57b51ea9Nb862ca5e.png”);
readStream.on(“data”,function(chunk){
console.log(chunk);
});
readStream.on(“end”,function(){
console.log(“end”);
});
readStream.on(“error”,function(){
console.log(“error”);
});
2、写入流
var writeStream = fs.createWriteStream(“1.txt”);
writeStream.write(“加的老师\ndasd”);
writeStream.on(“end”,function () {
console.log(“end”);
});
所有可以读取数据的流都继承自stream.Readable,所有可以写入的流都继承自stream.Writable。
3、使用pipe
Readable中有一个pipe(),该方法可以将一个Readable流传送到一个Writeable流,其实复制文件也是这个思路,一边读取文件,一边写入文件:
var readStream = fs.createReadStream(“1.txt”);
var writeStream = fs.createWriteStream(“3.txt”);//3.txt不存在会自动创建
readStream.pipe(writeStream);

默认情况下,当Readable流的数据读取完毕,end事件触发后,将自动关闭Writable流。如果我们不希望自动关闭Writable流,需要传入参数,传入end传输为false,则触发end事件时write流不会关闭:
readStream.pipe(writeStream , {end : false});

4、复制大文件(视频等)的例子
/**

  • 用控制只写流的方式来读取大文件(如本例的视频数据)
  • 只有当只写流中数据写入后才能继续读取,
  • 这样可以防止写入的速度跟不上读取的速度,导致只写流的缓存爆掉
    */
    “use strict”;
    var fs = require(“fs”);
    var writeStream = fs.createWriteStream(“copy.avi”);//创建写入流
    var readStream = fs.createReadStream(“7-Activiti完成自动发送邮件功能.avi”);//创建读取流
    var totalSize = fs.statSync(“7-Activiti完成自动发送邮件功能.avi”).size;//总大小
    var start = Date.now();//开始时间
    var hasWriteStream = 0;//已经复制的内容
    var timer = setInterval(compute,10);//定时器,每10豪秒执行一次compute函数

readStream.on(“data”,function (chunk) {
hasWriteStream += chunk.length;//累加已读取内容
if(writeStream.write(chunk) === false){ // 若数据没有完全写入,则暂停只读流读取数据
readStream.pause();
}
});
readStream.on(“end”,function () {
writeStream.end();//写入全部结束触发end事件
clearInterval(timer);//清除定时器
});
writeStream.on(“drain”,function(){
//若写入流的数据已写入完毕,则唤醒只读流继续读取数据
readStream.resume();
});
function compute(){
var domain = Date.now() - start;
console.log(“用时:” + domain +“ms----------”+ “已读取:” + hasWriteStream / 1000000 + “M” )
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值