热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

node中的流的介绍(Stream)

Stream是一个抽象接口,Node中有很多对象实现了这个接口。例如,对http服务器发起请求的request对象就是一个Stream,还

Stream是一个抽象接口,Node中有很多对象实现了这个接口。例如,对http服务器发起请求的request对象就是一个Stream,还有stdout(标准输出)。

Node.js,Stream有四种流类型:

  • Readable--可读操作。
  • Writable--可写操作。
  • Duplex--可读可写操作。
  • Transform--操作被写入数据,然后读出结果。


所有的Stream对象都是EventEmitter的实列。常用的事件有:

  • data--当有数据可读时触发。
  • end--没有更多的数据可读时触发。
  • error--在接收和写入过程中发生错误时触发。
  • finish--所有数据已被写入到底层系统时触发。


1、Readable

  • 可读流的例子包括:

    • HTTP responses, on the client
    • HTTP requests, on the server
    • fs read streams
    • zlib streams
    • crypto streams
    • TCP sockets
    • child process stdout and stderr
    • process.stdin


以fs为例创建一个可读流:

fs.createReadStream(path,[options]);

  • path --- 要读取文件的路径
  • options --- 一个数组对象包含:

                  flags:指定用什么模式打开,“w”代表写,“r”代表读。

                  endoding:编码格式“utf8","ascii","base64"三种格式,默认“utf8”。

                  highWaterMark:水位线

                  autoClose:为true时(默认行为),对错误或结束的文件描述符将自动关闭,为                 false时,文件描述符将不会被关闭,即使他们报错了。

                 start:开始读取的字节位置

                 end:结束读取的字节位置。

创建一个1.txt文件,内容:asdfasd

同一目录下创建一个js文件

let fs = require("fs");
let path = require("path");
let readable = fs.createReadStream(path.join(__dirname,"./1.txt"),{flags: 'r',encoding: 'utf8',autoClose: true,mode: "0666",
});
readable.on('data', function(chunk){console.log( chunk.length, chunk);
});
//7 'asdfasd'

可读的流有两种模式:

流动模式:数据会自动从来源流出,直到来源数据耗尽。

暂停模式:你得通过stream.read()主动去要数据,不要数据就一直等在那。


可读流在创建时都是暂停模式。暂停模式和流动模式可以相互转换。


2、Writable

  • 可写流的例子包括了:

    • HTTP requests, on the client
    • HTTP responses, on the server
    • fs write streams
    • zlib streams
    • crypto streams
    • TCP sockets
    • child process stdin
    • process.stdout, process.stderr

例如:

let fs = require("fs");
let path = require("path");
let writable = fs.createWriteStream(path.join(__dirname,"./1.txt"),{flags: 'w',encoding: 'utf8',autoClose: true,mode: "0666",
});
writable.on('finish', function(){console.log('写入完成');process.exit(0);
});
writable.write('node修炼中...', 'utf8');
writable.end();
//写入完成

3、Duplex

  • Duplex 流的实例包括了:

    • TCP sockets
    • zlib streams
    • crypto streams


4、Transform

变换流的实例包括:

  • zlib streams
  • crypto streams




推荐阅读
author-avatar
季柔原
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有