zoukankan      html  css  js  c++  java
  • 理解 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)
    
  • 相关阅读:
    HDU-1215 七夕节 数论 唯一分解定理 求约数之和
    LightOJ-1259 Goldbach`s Conjecture 数论 素数筛
    [前端-动态数据可视化]横向柱状图的动态数据可视化
    CodeForces-722C Destroying Array 并查集 离线操作
    CodeForces-920E Connected Components? 广度搜索 双向链表 判断联通 大量重复节点的删除
    CodeForces-1007A Reorder the Array 贪心 田忌赛马
    POJ-3692 Kindergarten 二分图 最大团
    个人开发者做一款Android App需要知道的事情
    android各种组件的监听器
    留言处插入xss不弹框
  • 原文地址:https://www.cnblogs.com/cckui/p/10988971.html
Copyright © 2011-2022 走看看