本文实例讲述了node . js中流流中可读流和可写流的实现与使用方法。分享给大家供大家参考,具体如下:
节点。js中的流流是处理流式数据的抽象接口.node。js提供了很多流对象,像http中的请求和响应,和过程。stdout都是流的实例。
流可以是可读的,可写的,或是可读可写的。所有流都是事件的实例。
<强>一、流的类型强>
node . js中有四种基本流类型:
1,可写可写流(例:fs.createWriteStream ())
2,可读可读流(例:fs.createReadStream ())
3,双工可读又可写流(例:净。套接字)
4,变换读写过程中可修改或转换数据的双相流(例:zlib.createDeflate ())
<强>二、流中的数据有两种模式强>
1,二进制模式,都是字符串字符串,和缓冲区。
2,对象模式,流内部处理的是一系统普通对象。
<强>三,可读流的两种模式强>
1,流动模式(流动),数据自动从系统底层读取,并通过事件,尽可能快地提供给应用程序。
2,暂停模式(停顿了一下),必须显式的调用读()读取数据。
可读流都开始于暂停模式,可以通过如下方法切换到流动模式:
1,添加‘数据’事件回调。
2,调用简历()。
3,调用管()。
可读流通过如下方法切换回暂停模式:
1,如果没有管道目标,调用暂停()。
2,如果有管道目标,移除所有管道目标,调用unpipe()移除多个管道目标。
<强>四,创建可读流,并监听事件强>
const fs=要求(fs);//创建一个文件可读流 让rs=fs.createReadStream (’。/1。txt”, {//文件系统标志 国旗:‘r’,//数据编码,如果调置了该参数,则读取的数据会自动解析//如果没调置,则读取的数据会是缓冲区//也可以通过rs.setEncoding()进行设置 编码:“use utf8”,//文件描述符,默认为null fd:空,//文件权限 模式:0 o666,//文件读取的开始位置 开始:0,//文件读取的结束位置(包括结束位置) 结束:无穷,//读取缓冲区的大小,默认64 k highWaterMark: 3 });//文件被打开时触发 rs.on(“开放”,函数(){ console.log(“文件打开的); });//监听数据事件,会让当前流切换到流动模式//当流中将数据传给消费者后触发//由于我们在上面配置了highWaterMark为3字节,所以下面会打印多次。 rs.on(“数据”功能(数据){ console.log(数据); });//流中没有数据可供消费者时触发 rs.on(“结束”,函数(){ console.log(“数据读取完毕”); });//读取数据出错时触发 rs.on(“错误”,函数(){ console.log('读取错误的); });//当文件被关闭时触发 rs.on(“关闭”,函数(){ console.log(“文件关闭”); }); >之前注意,“开放”和“关闭”事件并不是所有流都会触发。
当们监听‘数据’事件后,系统会尽可能快的读取出数据。但有时候,我们需要暂停一下流的读取,操作其他事情。
这时候就需要用简历到暂停()和()方法。
const fs=要求(fs);//创建一个文件可读流 让rs=fs.createReadStream (’。/1。txt”, { highWaterMark: 3 }); rs.on(“数据”功能(数据){ 控制台。日志(“读取了${数据。长度}字节数据:$ {data.toString ()}”);//使流动模式的流停止触发“数据”事件,切换出流动模式,数据都会保留在内部缓存中。 rs.pause ();//等待3秒后,再恢复触发“数据”事件,将流切换回流动模式。 setTimeout(函数(){ rs.resume (); },3000); }); >之前可读流的“可读性”事件,当流中有数据可供读取时就触发。
注意当监听“可读性”事件后,会导致流停止流动,需调用读()方法读取数据。
注意> const fs=要求(fs); 让rs=fs.createReadStream (’。/1。txt”, { highWaterMark: 1 });//当流中有数据可供读取时就触发 rs.on(“可读”,函数(){ 让数据;//循环读取数据//参数表示要读取的字节数//如果可读的数据不足字节数,则返回缓冲区剩余数据//如是没有指定字节数,则返回缓冲区中所有数据 而(data=https://www.yisu.com/zixun/rs.read ()) { 控制台。日志(“读取到${数据。长度}字节数据的); console.log (data.toString ()); } });
node . js中流流中可读流和可写流的实现与使用方法实例分析