nodejs-stream

stream模块初解,流的类型,流的历史

const stream = require('stream');

stream 流 是一种在nodejs中处理‘流式数据’的抽象接口

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

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

可读流Readable的使用,可写流Writable的使用

Readable:两种模式,三种状态

两种模式:流动中(flowing)或已暂停(paused),可读流一档处于二者其一

  • 在 flowing 模式中,数据自动地从底层的系统被读取,并通过 EventEmiter 接口的事件尽可能快地被提供给应用程序。
  • 在 paused 模式中,必须显式调用 stream.read() 方法来从流中读取数据片段。

三种状态:在任意时刻,任一可读流会处于以下三种状态之一:

  • readable.readableFlowing = null    // 没有提供消费流数据的机制,不会产生数据
  • readable.readableFlowing = false   // 暂时停止事件流动,但数据依旧产生
  • readable.readableFlowing = true    // 事件流动,产生数据

事件:close、data、end、error、readable

Writable

事件:close、drain、finish、error、pipe、unpipe

Duplex的使用,Transform的使用

Duplex:同时实现了 Readable 和 Writable 接口的流

Transform:变换流,是一种 Duplex 流

stream的流的使用技巧,管道,链的使用,流的优化

管道流:.pipe()

 

fs中的流使用:大多用在管道流的使用上:.pipe().pipe()...

// import { read } from 'fs';

var cl = function(data){
    console.log(data);
}
var clstr = function(data){
    console.log(data.toString());
}

/** Stream 流的四种类型:
 * Readable : 可读
 * Writeable : 可写
 * Duplex : 可读可写
 * Transform : 操作被写入数据,然后读出结果
 */
/** Stream 对象事件
 * data : 当有数据可读时触发。
 * end : 没有更多的数据可读时触发
 * error : 在接收和写入过程中发生错误时触发
 * finish : 所有数据已被写入到底层系统时触发
 */

var fs = require('fs');
var stream = require('stream');
var data = '';

/** 创建测试文件 */
var fcreateFile = function(){
    fs.writeFile('./theTest.txt','this is a test data of strem', function(err){
        if(err){
            throw err;
        }
        cl('创建成功');
    })
}
// fcreateFile();


/** 创建可读文件流 */
var freadStream = function(){
    // 创建可读流
    var readerStream = fs.createReadStream('theTest.txt');
    // cl(readerStream);   // 一个ReadStream格式的对象

    // 设置编码utf8
    readerStream.setEncoding('UTF8');

    // 处理流事件---->data, end, and error
    readerStream.on('data', function(chunk){
        data += chunk;

        cl('监听事件---->data');
        cl(data);       // 'this is a test data of strem' 文件内容
    })

    readerStream.on('end', function(){
        cl('监听事件---->end');
        cl(data);       // 'this is a test data of strem' 文件内容
    })

    readerStream.on('error', function(err){
        console.error('ERROR!!!')
        cl(err.stack);
    })
}
// freadStream();


/** 写入文件流 */
var fwriteStream = function(){
    var data = 'the test of write Stream\n';
    // 创建可写流
    // var writeStream = fs.createWriteStream('output.txt');   // 覆盖式写入
    var writeStream = fs.createWriteStream('output.txt', {'flags' : 'a'});  // 追加式写入

    // 写入数据并指定编码格式
    writeStream.write(data, 'UTF8');
    // writeStream.write(data, {'flags' : 'a'}, 'UTF8');    ERROR function!!!!

    // 标记文件末尾
    writeStream.end();

    // 处理流事件---->data, end, and error
    writeStream.on('finish', function(){
        cl('写入完成');
    });

    writeStream.on('error', function(err){
        cl('ERROR');
        cl(err.stack);
    });
}
// fwriteStream();

/** 管道流
 * 用于从一个流中获取数据并将数据传递到另外一个流中
 */
var fpipeStream = function(){
    // 可读文件流
    var readerStream = fs.createReadStream('pipe_read.txt');

    // 追加写入方式文件流
    var writeStream = fs.createWriteStream('pipe_write.txt',{'flags' : 'a'});

    //管道读写操作
    readerStream.pipe(writeStream);

    cl('Over');
}
// fpipeStream();


/** 链式流 */
var fzlib = function(){
    var zlib = require('zlib');
    // 压缩
    exports.a = function(){
        fs.createReadStream('./zlib/input.txt')
            .pipe(zlib.createGzip())
            .pipe(fs.createWriteStream('./zlib/input.txt.gz'));
        
        cl('文件压缩完成');
    }

    // 解压
    exports.b = function(){
        fs.createReadStream('./zlib/input.txt.gz')
            .pipe(zlib.createGunzip())
            .pipe(fs.createWriteStream('./zlib/output.txt'));

        cl('文件解压完成')
    }
}
// fzlib().a();
cl(fzlib);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值