Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。
例如,对http 服务器发起请求request 对象就是一个 Stream,还有stdout(标准输出)
Node.js,Stream 有四种流类型:
Readable - 可读操作。
Writable - 可写操作。
Duplex - 可读可写操作.
Transform - 操作被写入数据,然后读出结果。
所有的 Stream 对象都是 EventEmitter 的实例,常用的事件有:
data - 当有数据可读时触发。
end - 没有更多的数据可读时触发。
error - 在接收和写入过程中发生错误时触发。
finish - 所有数据已被写入到底层系统时触发。
App.js:
var http=require("http");
var stream=require("./stream");
var emit=require("./emit");
var bibe=require("./bibe");
http.createServer(function(req,res){
if(req.url!="/favicon.ico"){
res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
//执行流文件
stream();
emit();
bibe();
res.write("服务器");
}
res.end();
}).listen(8100);
- 读取流和写入流:
stream.js:
var fs=require("fs");
module.exports=function(){
//读取流 readable
var result="";
var readStream=fs.createReadStream("./data.txt");
//设置流文件的编码格式
readStream.setEncoding("utf-8");
//data事件 当有可读的数据时触发的事件
readStream.on("data",function(res){
result+=res;
});
//end事件 当没有数据可读时触发的事件
readStream.on("end",function(){
//输出所有的流数据
console.log(result);
});
//error事件 在流读取的时候出现异常 读取失败
readStream.on("error",function(err){
if(err) throw err;
});
//写入流 writeable
var txt="我是写入数据";
//创建写入流
var writeStream=fs.createWriteStream("./list/text.txt");
//写入数据
writeStream.write(txt,"utf-8");
//关闭流 写入流关闭之后,触发finish事件
writeStream.end();
//写入流 执行完成
writeStream.on("finish",function(){
console.log("数据写入完成");
});
}
如何实现从data.txt中读取,从text.txt中写入?
法一:使用Promise实现
stream.js:
var fs=require("fs");
module.exports=function(){
var promise=new Promise(function(resolve){
//读取流 readable
var result="";
var readStream=fs.createReadStream("./data.txt");
//设置流文件的编码格式
readStream.setEncoding("utf-8");
//data事件 当有可读的数据时触发的事件
readStream.on("data",function(res){
result+=res;
});
//end事件 当没有数据可读时触发的事件
readStream.on("end",function(){
//输出所有的流数据
resolve(result);
});
//error事件 在流读取的时候出现异常 读取失败
readStream.on("error",function(err){
if(err) throw err;
});
});
promise.then(function(res){
var txt=res;
//创建写入流
var writeStream=fs.createWriteStream("./list/text.txt");
//写入数据
writeStream.write(txt,"utf-8");
//关闭流 写入流关闭
writeStream.end();
//写入流 执行完成
writeStream.on("finish",function(){
console.log("数据写入完成");
});
});
}
法二:使用EventEmitter事件车实现
emit.js:
var fs=require("fs");
//广播 事件车 广播和发送
var event=require("events");
//node里EventEmitter为事件广播类 在整个node项目中都能使用 不能多次new
var emit=new event.EventEmitter();
module.exports=function(){
//读取流 readable
var result="";
var readStream=fs.createReadStream("./data.txt");
readStream.setEncoding("utf-8");
readStream.on("data",function(res){
result+=res;
});
readStream.on("end",function(){
//输出所有的流数据
//发送广播
emit.emit("tosend",result)
});
readStream.on("error",function(err){
if(err) throw err;
});
//接收广播
emit.on("tosend",function(res){
//创建写入流
var txt=res;
var writeStream=fs.createWriteStream("./list/text.txt");
writeStream.write(txt,"utf-8");
writeStream.end();
writeStream.on("finish",function(){
console.log("数据写入完成");
});
});
}
- 管道流
pipe.js:
var fs=require("fs");
//管道流 边读边写
var readStream=fs.createReadStream("./data.txt");
var writeStream=fs.createWriteStream("./list/text.txt");
readStream.pipe(writeStream);
目录: