理解 Node.js 中 Stream(流)

Posted cckui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解 Node.js 中 Stream(流)相关的知识,希望对你有一定的参考价值。

Stream(流) 是 Node.js 中处理流式数据的抽象接口。 stream 模块用于构建实现了流接口的对象。

Node.js 提供了多种流对象。 例如,对 HTTP 服务器的request请求process.stdout(标准输出), 都是流的实例。

流可以是可读的、可写的、或者可读可写的。 所有的流都是 EventEmitter 的实例。

Stream 的4种类型

1. Readable - 可读的流(fs.createReadStream())

2. Writable - 可写的流(fs.createWriteStream())

3. Duplex - 可读可写的流(net.Socket)

4. Transform - 操作被写入数据,然后读出结果。

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

data - 当有数据可读时触发

end - 没有更多的数据可读时触发

error - 在接收和写入过程中发生错误时触发

finish - 所有数据已被写入到底层系统时触发

实例 - 读写流(复制文件)

把文件 data.txt 中的内容复制到 copy.txt:

const fs = require('fs')
const path = require('path')

const fileName1 = path.resolve(__dirname, 'data.txt')
const fileName2 = path.resolve(__dirname, 'copy.txt')

// 创建一个可读流, 读取原文件的 stream 对象
const readStream = fs.createReadStream(fileName1)

// 创建一个可写流, 写入文件的 stream 对象
const writeStream = fs.createWriteStream(fileName2, 
    flags: 'a'  // a 表示追加写入, 如果需要覆盖写入,则用 'w'
)

// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readStream.pipe(writeStream)

// 逐渐的打印被读取的文件, 直到全部读取完成
readStream.on('data', chunk => 
    console.log(chunk.toString())
)

// 读取完成后执行
readStream.on('end', () => 
    console.log('全部复制完成')
)

从服务端读取文件内容

例如文件 data.txt 放在服务端,通过 get 请求读取:

const http = require('http')
const fs = require('fs')
const path = require('path')
const fileName1 = path.resolve(__dirname, 'data.txt')
const server = http.createServer((req, res) => 
    if (req.method === 'GET') 
        const readStream = fs.createReadStream(fileName1) 
        readStream.pipe(res) 
    
)
server.listen(3333)

以上是关于理解 Node.js 中 Stream(流)的主要内容,如果未能解决你的问题,请参考以下文章

node - 流 浅析

Node.js:Stream(流)

Node.js Stream(流)

Node.js Stream(流)

Node.js Buffer解读

Node篇