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” )
}