zoukankan      html  css  js  c++  java
  • NodeJS Stream流

    NodeJS Stream流

    流数据在网络通信中至关重要,nodeJS用Stream提供了一个抽象接口,node中有很多对象实现了这个接口,提供统一的操作体验

    基本流类型

    NodeJS中,Stream有四种类型:

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

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

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

    数据读取

    var fs = require('fs')
    var data = ''
    // 创建可读流
    var readerStream = fs.createReadStream('input.txt')
    
    // 处理流事件
    // 读取时
    readerStream.on('data', function (chunk) {
        data += chunk //数据可能因为尺寸较大是多次读取的
    })
    
    // 读取数据结束
    readerStream.on('end',function () {
        console.log(data)
    })
    
    readerStream.on('error',function (err) {
        console.log(err.stack)
    })
    
    console.log('读取完毕')
    

    数据写入

    var fs = require('fs')
    var data = '测试数据'
    
    // 创建一个写入流
    var writerStream = fs.createWriteStream('output.txt')
    
    // 使用utf8格式写入数据
    writerStream.write(data, "utf-8")
    // 标记文件结尾,触发finish
    writerStream.end()
    
    // 处理流事件
    writerStream.on('finish', function() {
        console.log("写入完成");
    });
    
    writerStream.on('error', function(err){
        console.log(err.stack);
    });
    

    管道流

    管道流可以连接输入流和输出流,可以实现大文件(如大于内存)的复制

    var fs = require('fs')
    // 创建一个可读流
    var readerStream = fs.createReadStream('1.png')
    // 创建一个写入流
    var writerStream = fs.createWriteStream('2.png')
    // 管道连接流对象
    readerStream.pipe(writerStream)
    

    链式流

    用于连续操作

    /*compress.js*/
    var fs = require('fs')
    var zlib = require('zlib')
    // 用gzip压缩input.txt
    fs.createReadStream('input.txt')
        .pipe(zlib.createGzip())
        .pipe(fs.createWriteStream('input.txt.gz'))
    console.log('文件压缩完成')
    
    /*decompress.js*/
    var fs = require('fs')
    var zlib = require('zlib')
    // 用gzip解压input.txt.gz
    fs.createReadStream('input.txt.gz')
        .pipe(zlib.createGunzip())
        .pipe(fs.createWriteStream('input2.txt'))
    console.log('文件解压完成')
    
  • 相关阅读:
    关系数据库&&NoSQL数据库
    NoSQL
    大数据时代的数据存储,非关系型数据库MongoDB
    判断是否为BST
    百度2017暑期实习生编程题
    memset()实现及细节
    在必须返回一个对象时,不要去尝试返回一个引用
    返回局部变量指针
    用引用返回值
    数组形参
  • 原文地址:https://www.cnblogs.com/fanghao/p/7813263.html
Copyright © 2011-2022 走看看