首页 > 语言 > JavaScript > 正文

node.js中stream流中可读流和可写流的实现与使用方法实例分析

2024-05-06 15:44:25
字体:
来源:转载
供稿:网友

本文实例讲述了node.js中stream流中可读流和可写流的实现与使用方法。分享给大家供大家参考,具体如下:

node.js中的流 stream 是处理流式数据的抽象接口。node.js 提供了很多流对象,像http中的request和response,和 process.stdout 都是流的实例。

流可以是 可读的,可写的,或是可读可写的。所有流都是 events 的实例。

一、流的类型

node.js中有四种基本流类型:

1、Writable 可写流 (例:fs.createWriteStream() )

2、Readable 可读流 (例:fs.createReadStream() )

3、Duplex 可读又可写流 (例:net.Socket )

4、Transform 读写过程中可修改或转换数据的 Duplex 流 (例:zlib.createDeflate() )

二、流中的数据有两种模式

1、二进制模式,都是 string字符串  和 Buffer。

2、对象模式,流内部处理的是一系统普通对象。

三、可读流的两种模式

1、流动模式 ( flowing ) ,数据自动从系统底层读取,并通过事件,尽可能快地提供给应用程序。

2、暂停模式 ( paused ),必须显式的调用 read() 读取数据。

可读流 都开始于暂停模式,可以通过如下方法切换到流动模式:

1、添加 'data' 事件回调。

2、调用 resume()。

3、调用 pipe()。

可读流通过如下方法切换回暂停模式:

1、如果没有管道目标,调用 pause()。

2、如果有管道目标,移除所有管道目标,调用 unpipe() 移除多个管道目标。

四、创建可读流,并监听事件

const fs = require('fs');//创建一个文件可读流let rs = fs.createReadStream('./1.txt', {  //文件系统标志  flags: 'r',  //数据编码,如果调置了该参数,则读取的数据会自动解析  //如果没调置,则读取的数据会是 Buffer  //也可以通过 rs.setEncoding() 进行设置  encoding: 'utf8',  //文件描述符,默认为null  fd: null,  //文件权限  mode: 0o666,  //文件读取的开始位置  start: 0,  //文件读取的结束位置(包括结束位置)  end: Infinity,  //读取缓冲区的大小,默认64K  highWaterMark: 3});//文件被打开时触发rs.on('open', function () {  console.log('文件打开');});//监听data事件,会让当前流切换到流动模式//当流中将数据传给消费者后触发//由于我们在上面配置了 highWaterMark 为 3字节,所以下面会打印多次。rs.on('data', function (data) {  console.log(data);});//流中没有数据可供消费者时触发rs.on('end', function () {  console.log('数据读取完毕');});//读取数据出错时触发rs.on('error', function () {  console.log('读取错误');});//当文件被关闭时触发rs.on('close', function () {  console.log('文件关闭');});

注意,'open' 和 'close' 事件并不是所有流都会触发。

当们监听'data'事件后,系统会尽可能快的读取出数据。但有时候,我们需要暂停一下流的读取,操作其他事情。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选