Node.jsFileSystem常用方法varfs=require(''fs'');varbuf=newBuffer( ''我喜爱编程'');fs.open(''./mess.txt'',''w'',function(err,fd){fs.write (fd,buf,3,9,0,function(err,written,buffer){fs.write(fd,b uf,12,3,null,function(err,written,buffer){if(err)co nsole.log(''写文件操作失败'');console.log(''写文件操作成功''); });});//同步写入fs.writeSync(fd,buf,3,9,0);});Nod e.jsFileSystem常用方法2.写入文件(三)语法:fs.createWriteStream(path,[o ptions])接收参数:path文件路径[options]flags:指定文件操作,默认''w'',;encoding ,指定读取流编码;start指定写入文件的位置写入数据方法:write用于写入数据end结束写入,之后再写 入会报错;Node.jsFileSystem常用方法ws.write(chunk,[encoding],[callb ack]);chunk,可以为Buffer对象或一个字符串,要写入的数据[encoding],编码[callb ack],写入后回调ws.end([chunk],[encoding],[callback]);[chun k],要写入的数据[encoding],编码[callback],写入后回调Node.jsFileS ystem常用方法写入数据触发事件:drain当write方法返回false时,表示缓存区中已经输出到目标对象中,可 以继续写入数据到缓存区finish当end方法调用,全部数据写入完成pipe当用于读取数据的对象的pi pe方法被调用时unpipe当unpipe方法被调用error当发生错误文件系统示例代码一:varw s=fs.createWriteStream(''/test.txt'',{start:0});varbuffer= newBuffer.from(''我也喜欢你'');ws.write(buffer,''utf8'',function(err, buffer){console.log(arguments);console.log(''写入完成,回调函数没有参数 '')});//最后再写入的内容ws.end(''再见'');文件系统示例代码二:letfs=require("fs"); letws=fs.createWriteStream(''./2.txt'');//write是异步方法,有返回值,每次调用w rite方法会返回布尔值letflag=ws.write(''1'');//write里面只能是字符串或buffer//监控内 存里面全部写完了,恢复读取,才会调用此方法ws.on(''drain'',function(){console .log("内存干了");});ws.end()//结束,会强制将内存中的内容全部写入,然后关闭文件//返回值是true 表示能继续写入,如果为false就不要继续写入//res.write()res是一个可写流//假如文件大小1G大,每次读取6 4K,每次写16K,写不完的剩下的放内存,已经写不下时候,先暂停不要读取了//等我把内存空间的写完成了,和当前写流中的内容全部写 入后,再继续读取文件系统3.读取文件(一)读取文件的语法如下:fs.readFile(file[,options], callback)fs.readFileSync(file[,options])参数:filename文件路径(或 文件名)optionsoption对象,包含encoding,编码格式,该项是可选的。callback 回调,传递2个参数异常err和文件内容data文件系统示例代码:varfs=require(''fs'') ;fs.readFile(''test.txt'',function(err,data){if(err){ console.log(err);}else{console.log(data.toString());} })文件系统3.读取文件(二)读取文件的语法如下:fs.read(fd,buffer,offset,len gth,position,callback)fs.readSync(fd,buffer,offset,length, position)参数:fd–通过fs.open()方法返回的文件描述符;buffer–数据写入的缓冲区; offset–缓冲区写入的写入偏移量;length–要从文件中读取的字节数;position–文件读取的起始 位置,如果position的值为null,则会从当前文件指针的位置读取;callback–回调函数,有三个参数err ,bytesRead,buffer,err为错误信息,bytesRead表示读取的字节数,buffer为缓冲区对象; 文件系统示例如下:varfs=require(''fs'');fs.open(''test.txt'',''r'',fun ction(err,fd){if(err){console.error(err);return;}va rbuf=newBuffer(8);fs.read(fd,buf,0,8,null,function(err ,bytesRead,buffer){if(err){console.error(err);return; }console.log(''bytesRead:''+bytesRead);console.log(buffer); })});文件系统3.读取文件(三)fs.createReadStream(path,[options])接 收参数:path:(string)欲读取的文件路径options:(object)数组对象包含以下属性 {flags:''r'',encoding:null,fd:null,mode:0666,autoC lose:true}文件系统options可通过start和end设置文件可读取的字节数范围,而不是读取整个文件 。如果start和end都被包含的情况下,将从0开始。encodeing可以是‘utf8′,‘ascii'',或 ‘base64′三种格式。如果autoClose为false时,文件描述符将不会被关闭,即使他们报错了。最好把它关闭掉并确保 不会出现文件描述符泄漏。如果autoClose为true时(默认的行为),对错误或结束的文件描述符将自动关闭。文件系统触 发事件:readable数据可读时data数据读取后end数据读取完成时error 数据读取错误时close关闭流对象时读取数据的对象操作方法:read读取数据方法setE ncoding设置读取数据的编pause通知对象众目停止触发data事件resume通知对象恢复触发d ata事件pipe设置数据通道,将读入流数据接入写入流;unpipe取消通道unshift当流数据 绑定一个解析器时,此方法取消解析器文件系统代码示例:varfs=require(''fs'');varreadStr eam=fs.createReadStream(''./message.txt'',{start:3,end:12});read Stream.on(''open'',function(fd){console.log(''开始读取文件'');});rea dStream.on(''data'',function(data){console.log(''读取到数据:''); console.log(data);});readStream.on(''end'',function(){consol e.log(''文件已全部读取完毕'');});readStream.on(''close'',function(){con sole.log(''文件被关闭'');});readStream.on(''error'',function(err){c onsole.log(''读取文件失败'');});文件系统读写文件的总结:node.js中对文件的操作需要引入“fs”模块 varfs=require(''fs'');fs模块提供了对文件操作的三种读写方式:三种读文件:readFile,re ad,createReadStream三中写文件:writeFile,write,createWriteStream区别: 1)readFile和writeFilereadFile:将要读取的文件内容完整读入缓存区,再从该缓存区中读取文件内容文 件系统writeFile:将要写入的文件内容完整的读入缓存区,然后一次性的将缓存区中的内容写入都文件中。2)read和wri teread:读取文件内容是不断地将文件中的一小块内容读入缓存区,最后从该缓存区中读取文件内容。write :1、将需要写入的数据写入到一个内存缓存区;2待缓存区写满后再将缓存区中的内容写入到文件中;3重复执行步骤1和步骤2,直到数据全部 写入文件为止。文件系统3)createReadStream和createWriteStream通过流的方式进行文件的读取 createReadStream:方法创建一个将文件内容读取为流数据的ReadStream对象;createWriteStre am:方法创建一个将流数据写入文件中的WriteStreamcreateReadStream和createWriteStream :可读写过程进行监听,并通过方法pause和resume暂停或恢复文件的读取操作,可以监听写入时缓存区数据是否已满或者是否已全部输 出文件系统1)readFile和writFile综合应用constfs=require(''fs'');fs.re adFile(''./data.txt'',function(err,data){if(err)throwerr; //写入数据fs.writeFile(''./input.txt'',data,function(err){ if(err)throwerr;console.log(''写入成功'');});}) 文件系统2)read和writ综合应用varfs=require(''fs'')fs.open(''input.txt'', ''a+'',''0666'',function(err,fd){if(err){console.log(err) }else{varbuffer=Buffer.alloc(100)fs.read(fd,bu ffer,0,3,null,function(err,bytesRead,buffer){if(er r){console.log(err)}else{console.log( bytesRead)console.log(buffer.slice(0,bytesRead).toStrin g(''utf-8''))}})varcontent1=''天''fs.write(fd ,Buffer.from(content1),0,3,null,function(err,bytesRead,buf fer){if(err){console.log(err)}else{c onsole.log(bytesRead)fs.close(fd,(err)=>{if (err){console.log(err)}else{ console.log(''关闭成功'')}})} })}})文件系统3)createReadStream和createWriteStream综合应用var fs=require(''fs'');varrs=fs.createReadStream(''1.txt'');varws =fs.createWriteStream(''2.txt'');rs.on(''data'',function(chunk){ if(ws.write(chunk)===false){rs.pause();//如果上一段读取的内容还未 写完,则暂停读取}});ws.on(''train'',function(){rs.resume();//上 一段内容全部写入完毕之后,开始继续读取});rs.on(''end'',function(){console.log( ''end'');ws.end();});rs.on(''error'',function(error){con sole.log(error);});Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用 对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后, 会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node 是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/ O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求 对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为 驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行 ,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行 状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现 异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生 产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通 知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O 的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求 对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环 系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Nod e有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个 请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处 理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的 事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记 录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I /O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机 制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I /O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通 知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/ O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态 、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观 察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的教师:王晓玲Q Q:4260924邮箱:4260924@qq.comNode.js开发主要内容文件系统 的基本概念文件系统的读写文件系统的其它API文件系统Node.js提供一组类似UNIX(POSIX)标准的文件操作AP I。Node导入文件系统模块(fs)语法如下所示:varfs=require("fs")fs模块是文件操作的封装,它 提供了文件的读取、写入、更名、删除、遍历目录、链接等POSIX文件系统操作。与其他模块不同的是,fs模块中所有的操作都提供了异步和 同步的两个版本,例如读取文件内容的函数有异步的fs.readFile()和同步的fs.readFileSync()。文件系统 一.目录操作1.创建目录创建目录的语法如下:fs.mkdir(path[,mode],callback)//异 步方法fs.mkdirSync(path[,mode])//同步方法示例:varfs=requir e("fs");//在该文件的同一目录下建立test目录fs.mkdir(''test'',function(err){if (err){returnconsole.error(err);}console.log("目录创建成功。"); });文件系统2.读取目录读取目录的语法如下:fs.readdir(path,callback)fs.readd irSync(path)1、path:文件路径;2、callback:回调函数,回调函数带有两个参数e rr,files。err为错误信息,files为目录下的文件数组列表。示例:varfs=require ("fs");fs.readdir("test/",function(err,files){if(err){re turnconsole.log(err);}files.forEach(function(file){cons ole.log(file);});});文件系统3.删除目录删除目录的语法如下:fs.rmdir(path, callback)fs.rmdirSync(path)示例:varfs=require("fs");fs.rmdir ("test/ewe",function(err){if(err){returnconsole.log(err); }fs.readdir("/test/",function(err,files){if(err){re turnconsole.error(err);}files.forEach(function(file){ console.log(file);});});});文件系统3.删除目录删除目录的语法如下:fs.r mdir(path,callback)fs.rmdirSync(path)示例:varfs=require("fs" );fs.rmdir("test/ewe",function(err){if(err){returnconsol e.log(err);}fs.readdir("/test/",function(err,files){if(e rr){returnconsole.error(err);}files.forEach(function (file){console.log(file);});});});文件系统2.文件操作1.打 开文件打开文件的语法如下:fs.open(path,flags,[mode],[callback(err,fd)]) path:为文件所在路径,flags:指文件的读取方式,mode:参数用于创建文件时给文件指定权限,默认是0666.回掉函数将 会传递一个文件描述符fd。flags:文件打开方式文件系统flags的常用参数值如下:文件系统mode参数表 示的文件权限,是POSIX操作系统中对文件读取和访问权限的规范,通常用一个八进制数来表示:r:4w:2x:1文件的 基本权限有9个,分别是owner、group、others三种身份各有自己的read、write、execute权限。例如文件的权 限字符为”-rwxrwxrwx”这9个权限是三个三个一组的。每种身份(owner、group、others)各自的权限(r、w、x )分数是需要累加的。例如,当权限为[-rwxrwx—]时,分数则是:owner=rwx=4+2+1=7g roup=rwx=4+2+1=7others=—=0+0+0=0所以在设置权限的更改时 ,该文件的权限数字就是770文件系统示例:varfs=require(''fs'');fs.open("t est.txt","w",0644,function(e,fd){try{fs.write(fd,"firstfs!" ,0,''utf8'',function(e){fs.closeSync(fd);})}catch(E){ throwe;}});文件系统2.写入文件(1)写入文件的语法如下:fs.writeFile(filename, data[,options],callback)fs.writeFileSync(filename,data[,opt ions])参数:filename(String)文件名称data(String|Buffer )将要写入的内容,可以使字符串或buffer数据。options(Object)option数组对象,包含: ·encoding(string)可选值,默认‘utf8′,当data使buffer时,该值应该为ignored; ·mode(Number)文件读写权限,默认值438;·flag(String)默认值‘w''callba ck{Function}回调,传递一个异常参数err。文件系统示例:varfs=require("fs"); fs.writeFile(''test.txt'',''helloworld!'',function(err){if(err ){returnconsole.log(err);}/fs.readFile(''test.txt'',func tion(err,data){if(err){returnconsole.log(err);} console.log("异步读取文件数据:"+data.toString());});/});Node.js FileSystem常用方法2.写入文件(二)语法:fs.write(fd,buffer,offset,lengt h,position,callback);fs.writeSync(fd,buffer,offset,length[, position])参数:fd文件描述符。(fs.open打开后生存的)buffer缓冲区,数据将被 写入。buffer尺寸的大小设置最好是8的倍数,效率较高。offsetbuffer写入的偏移量length (integer)指定文件读取字节数长度position(integer)指定文件读取的起始位置,如果该项为null,将 从当前文件指针的位置开始读取数据。encoding(String)字符编码Node有自身的事件循环机制,从I/ O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态 、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观 察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取 得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事 件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行 回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有 待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等 信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。 从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事 件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I /O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流 程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有 事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执 行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出 ,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用 对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后, 会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node 是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/ O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求 对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为 驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行 ,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行 状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现 异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生 产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通 知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O 的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求 对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环 系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Nod e有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个 请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处 理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的 事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记 录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I /O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机 制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I /O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通 知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/ O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态 、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观 察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取 得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事 件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行 回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有 待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等 信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。 从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事 件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I /O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流 程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有 事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执 行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出 ,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用 对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后, 会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node 是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/ O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求 对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为 驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行 ,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行 状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现 异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生 产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通 知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O 的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求 对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环 系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Nod e有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个 请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处 理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的 事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记 录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I /O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机 制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I /O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通 知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/ O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态 、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观 察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取 得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事 件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行 回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有 待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等 信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。 从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事 件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I /O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流 程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有 事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执 行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出 ,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用 对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后, 会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node 是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/ O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求 对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为 驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行 ,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行 状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现 异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生 产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通 知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O 的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求 对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环 系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Nod e有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个 请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处 理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的 事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记 录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I /O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机 制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I /O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通 知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/ O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态 、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观 察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取 得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事 件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行 回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有 待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等 信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。 从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事 件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I /O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流 程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有 事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执 行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出 ,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用 对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后, 会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node 是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/ O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求 对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为 驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行 ,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行 状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现 异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生 产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通 知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O 的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求 对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环 系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Nod e有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个 请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处 理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的 事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记 录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I /O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机 制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I /O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通 知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/ O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态 、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的Node有自身的事件循环机制,从I/O观察中取得是否还有待执行的事件,如果有事件,调用对应的I/O线程执行,这时会生产一个请求对象,这个请求对象记录了提交I/O的状态、记录了事件的回调等信息,在I/O线程执行完毕后,会修改请求对象的执行状态,并通知事件循环系统,将处理完成的I/O信息通知I/O观察者,执行回调函数。从上述流程可以看出,Node是以事件为驱动来实现异步I/O的 |
|