zoukankan      html  css  js  c++  java
  • Node.js Stream(流)

    Node.js Stream(流)

    参考https://www.runoob.com/nodejs/nodejs-stream.html

    • Stream是一个抽象接口,很多类都实现了它,例如:
     1. 对http服务器发起请求的request对象;
     2. stdout(标准输出)。
    
    • 4种Stream类型:
      1. Readable:可读操作;
      2. Writable:可写操作;
      3. Duplex:可读写操作;
      4. Transform:操作被写入的数据,然后读出结果。
    
    • 所有的Stream对象都是EventEmitter的实例。常用的事件有:
     1. data:当有数据可读时触发;
     2. end:没有更多的数据可读时触发(类似于EOF);
     3. error:在接收和写入过程种发生错误时触发;
     4. finish:单次操作写入所有数据都已被写入完成时触发。
    

    中读取数据

    使用input.txt作为可读的文本文件,内容为:

      菜鸟教程官网地址:www.runoob.com
    

    创建main.js文件,代码如下:

    var fs = require('fs');
    var data = '';
    
    // 创建可读流
    var readerStream = fs.createReadStream('input.txt');
    // 设置编码为utf-8,可省略
    readerStream.setEncoding('utf8');
    
    // 处理流事件
    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('程序执行完毕');
    

    结果:

      程序执行完毕
      菜鸟教程官网地址:www.runoob.com
    

    默认的读取编码为'utf8',可以省略。

    写入流

    var fs = require('fs');
    var data = '菜鸟教程官网地址:www.runoob.com';
    
    // 创建可写流
    var writerStream = fs.createWriteStream('input.txt');
    // 设置编码为utf-8并写入
    // writerStream.write(data, 'utf8');
    writerStream.write(data);
    // 标记文件末尾
    writerStream.end();
    
    // 处理流事件
    writerStream.on('finish', function(chunk){
    	console.log('写入完成');
    });
    writerStream.on('error', function(err){
    	console.log(err.stack);
    });
    console.log('程序执行完毕');
    

    结果:

      程序执行完毕
      写入完成
    

    默认的写入编码为'utf8',可以省略。

    管道流

    管道流提供了一个输出流到输入流的机制,用于流与流之间的数据传递。
    src=>dest

    var fs = require('fs');
    
    // 创建可读流
    var readerStream = fs.createReadStream('input.txt');
    // 创建可写流
    var writerStream = fs.createWriteStream('output.txt');
    
    // 管道流操作,将readerStream中的数据流入到writerStream中
    readerStream.pipe(writerStream);
    
    console.log('程序执行完毕');
    

    结果:

      程序执行完毕
    

    查看output.txt中的内容:

      菜鸟教程官网地址:www.runoob.com
    

    链式流

    通过连接输出流到另外一个流并创建多个流操作链的机制,一般用于管道操作。

    var fs = require('fs');
    var zlib = require('zlib');
    
    // 压缩input.txt文件为input.txt.gz
    fs.createReadStream('input.txt')
    	.pipe(zlib.createGzip())
    	.pipe(fs.createWriteStream('input.txt.gz'));
    
    console.log('文件压缩完毕');
    

    结果:

      文件压缩完毕
    

    同时当前目录下生成了input.txt.gz的压缩文件。
    尝试解压该文件:

    var fs = require('fs');
    var zlib = require('zlib');
    
    // 解压input.txt.gz文件为input.txt
    fs.createReadStream('input.txt.gz')
    	.pipe(zlib.createGzip())
    	.pipe(fs.createWriteStream('input.txt'));
    
    console.log('文件解压完毕');
    

    结果:

      文件解压完毕
  • 相关阅读:
    用Apache Kafka构建流数据平台
    kafka与传统的消息中间件对比
    Azkaban简介和使用
    kettle初探
    less命令
    spring扩展点之二:spring中关于bean初始化、销毁等使用汇总,ApplicationContextAware将ApplicationContext注入
    Spring 注释标签@Resource @Autowired 和@Inject的区别
    【MyEclipse 2015】 逆向破解实录系列【2】(纯研究)
    HDOJ 5073 Galaxy 数学 贪心
    windows 8.0上eclipse 4.4.0 配置centos 6.5 上的hadoop2.2.0开发环境
  • 原文地址:https://www.cnblogs.com/pangqianjin/p/14192750.html
Copyright © 2011-2022 走看看