stream流
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求request 对象就是一个
Stream,还有stdout(标准输出)。
Node.js,Stream 有四种流类型:
Readable - 可读操作。
Writable - 可写操作。
Duplex - 可读可写操作.
Transform - 操作被写入数据,然后读出结果。
所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:
data - 当有数据可读时触发。
end - 没有更多的数据可读时触发。
error - 在接收和写入过程中发生错误时触发。
finish - 所有数据已被写入到底层系统时触发
1. 创建可读流
//从流中读取数据
var fs=require("fs");
//设置读取的数据
var data="";
// 创建流
var readStream=fs.createReadStream("content.txt");
//设置编码格式
readStream.setEncoding("UTF-8");
//处理流的事件
//data 有数据可读的时候触发
readStream.on("data",function (res){
data+=res;
});
//没有数据可读时触发
readStream.on("end",function (){
console.log(data);
});
//在读取时发生错误时触发
readStream.on("error",function (err){
console.log(err);
});
//写入完成的时候触发
writeStream.on("finish", () => {
console.log("数据写入完成");
});
2. 写入流
streamdata.on("end", () => {
console.log("数据读取完成");
console.log(data);
//创建写入流
let writeStream = fs.createWriteStream(__dirname + "/1117.docx");
//配置写入的数据以及编码
writeStream.write(data, 'utf-8');
writeStream.end();
//写入出错
writeStream.on("err", (err) => {
if (err) {
throw err;
}
});
//写入完成的时候触发
writeStream.on("finish", () => {
console.log("数据写入完成");
});
});
3. 管道流(边读边写)
// 管道流 边读边写
let readstream = fs.createReadStream("public/stu.txt");
let writestream = fs.createWriteStream("public/data.txt");
readstream.pipe(writestream);
readstream.on("end", () => {
console.log("管道流读取数据完成");
});
writestream.on("finish", () => {
console.log("管道刘写入数据完成");
});
node里面的阻塞IO和非阻塞IO
Nodejs 非阻塞的IO、异步以及事件驱动EventEmitter 处理异步
Nodejs单线程 非阻塞IO 事件驱动
Nodejs回调处理异步
Nodejs events模块处理异步
1. 回调函数处理异步 (非阻塞)
var fs=require("fs");
//阻塞请求数据 等待请求完成在执行后续代码
var data=fs.readFileSync("mime.json");
console.log(data.toString());
// 非阻塞式请求代码 nodejs中多数方法为异步请求方式
fs.readFile("mime.json",function (err,res){
if(err) throw err;
console.log(res.toString());
});
console.log(1);
//处理异步请求 外边可以获取到请求的数据的方式
//1.使用回调函数来获取数据
function getMime(callback){
fs.readFile("mime.json",function (err,res){
if(err) throw err;
callback(res.toString());
});
}
console.log(1);
//这样就可以在外部获取异步的数据 也可以暴露出去别的文件使用
module.exports=getMime(function (data){
console.log(data);
});
2. 使用nodejs内置模块事件的驱动 events 来进行数据的广播和监听
var fs=require("fs");
var event=require("events");
//实例化事件的对象
var EventEmitter=new event.EventEmitter();
//使用events模块 获取异步的数据
//在请求完数据之后进行广播
fs.readFile("mime.json",function (err,res){
if(err) throw err;
EventEmitter.emit("mime",res.toString());
});
//在外部进行监听广播
EventEmitter.on("mime",function (data){
console.log(data);
});
//在不同的文件之间广播和监听使用都可以获取数据