跳至主要內容

1.6 Stream(流) 🎉

刘春龙...大约 3 分钟NODEJSNODE后端nodejs

1.6 Stream(流) 🎉

流是为 Node.js 应用程序提供动力的基本概念之一。

流是一种以高效的方式处理读/写文件、网络通信、或任何类型的端到端的信息交换。

stream 提供了构建所有流 API 的基础。 所有的流都是 EventEmitter 的实例。

var fs = require("fs");
fs.readFile(__dirname + '/aaindex.txt', (err, data) => {  //参数说明:这里是错误优先
    console.log(data.toString())
})

流基本上提供了两个主要优点:

内存效率: 无需加载大量的数据到内存中即可进行处理。

时间效率: 当获得数据之后即可立即开始处理数据,这样所需的时间更少,而不必等到整个数据有效负载可用才开始。

Stream有四种流类型:

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

流常用的事件有:

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

使用stream模块创建可读流 💎

const Stream = require('stream')
//首先创建流对象
const readableStream = new Stream.Readable()
//实现 readable._read() 方法,该方法必须要实现
readableStream._read=()=>{}
//监听可读流里面是否有可读的数据
readableStream.on('data',(chunk)=>{
  console.log(chunk.toString())
})
//发送数据
readableStream.push('百战')
readableStream.push('程序员')

读取文件:

//可读流可以从一文件中读取信息。
//读取的数据可以暂时存放在缓存(Buffer)里,防止应用程序无法及时处理。 
//创建可读流
var fs = require("fs");
var readerStream = fs.createReadStream('./aaindex.txt');
let data = ""
// 处理流事件 
readerStream.on('data', (chunk) => {
    console.log(chunk);
    data += chunk;
});
readerStream.on('end', () => {
    console.log("读取完毕",data);
});

使用stream模块创建可写流 💎

//创建可写流对象
const Stream = require('stream')
const writableStream = new Stream.Writable()
//实现_write
writableStream._write = (chunk, encoding, next) => {
    console.log(chunk.toString())
    next()
}
//写入数据
writableStream.write('hellow')
writableStream.write('world')

写入文件:

//可写流可以将数据写入文件中。
//为了防止因为写入目标处理速度太慢导致数据丢失,写入的数据可以暂存在可写流//内部的缓存(Buffer)中。
//创建文件可写流对象
const fs = require('fs')
const writableStream = fs.createWriteStream('./aaindex.txt', { flags: "a" });
// 使用 utf8 编码写入数据
writableStream.write('123123', 'UTF8');
writableStream.write('456456', 'UTF8');
// 标记文件末尾
writableStream.end();
// 监听写入文件完成
writableStream.on('finish', function () {
    console.log("写入完成。");
})

flags属性值说明

  • a : 把内容追加到文件原有的内容的后面
  • w : 默认值,直接覆盖文件的所有内容

管道流 💎

管道提供了一个数据从输出流到输入流的机制。

我们使用管道可以从一个流中获取数据并将数据传递到另外一个流中。

举例:复制文件

我们把文件比作装水的桶,而水就是文件里的内容,我们用一根管子(pipe)连接两个桶使得水从一个桶流入另一个桶,这样就慢慢的实现了大文件的复制过程。

var fs = require("fs");
// 创建一个可读流
var readerStream = fs.createReadStream('./input.txt');
// 创建一个可写流
var writerStream = fs.createWriteStream('./output.txt');
// 管道读写操作,读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream);

链式流 💎

链式是通过连接输出流到另外一个流并创建多个流操作链的机制。

pipe() 方法的返回值是目标流。

var fs = require("fs");
var zlib = require('zlib');
fs.createReadStream('./aaindex.txt')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('./aaindex.txt.gz'));
上次编辑于:
贡献者: 刘春龙
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.7