博客
关于我
Node.js学习笔记(八、Stream流)
阅读量:606 次
发布时间:2019-03-11

本文共 2285 字,大约阅读时间需要 7 分钟。

Node.js Stream(流)

在Node.js开发中,Stream(流)是处理文件读写和数据传输的核心工具。许多Node.js对象实现了Stream接口,例如request对象(用于处理HTTP请求)和stdout(标准输出)等。Stream在数据处理中的作用非常重要,因为它能够高效地处理大量数据,尤其是在网络传输和文件操作中。

Stream 的类型

Node.js中定义了四种Stream类型:

  • Readable(可读):支持从流中读取数据的操作。
  • Writable(可写):支持将数据写入流中的操作。
  • Duplex(双向):既支持可读又支持可写操作。
  • Transform(变换):在数据被写入流时,如何处理并通过pipe方法传递给下一个流。
  • 此外,所有 Stream对象都是EventEmitter的实例,它们触发了一系列重要的事件:

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

    从流中读取数据

    在实际操作中,创建一个可读流并读取文件内容非常常见。以下是一个典型的代码示例:

    var fs = require('fs');
    var data = '';
    // 创建可读流,指定编码为UTF-8
    var readerStream = fs.createReadStream('input.txt', 'UTF8');
    // 处理流事件
    readerStream.on('data', function(chunk) {
    data += chunk;
    });
    readerStream.on('end', function() {
    console.log(data);
    });
    readerStream.on('error', function(err) {
    console.log(err.stack);
    });

    运行前,请确保创建一个input.txt文件并将所需内容写入其中。

    写入流

    类似地,创建可写流并将数据写入文件也是常见操作。以下是示例代码:

    var fs = require('fs');
    var data = '相信我,我会让你看到你的脑浆';
    // 创建可写流,写入到`output.txt`文件中
    var writerStream = fs.createWriteStream('output.txt', 'UTF8');
    // 向流中写入数据
    writerStream.write(data, 'UTF8');
    // 标记文件末尾,完成写入操作
    writerStream.end();
    // 监听完成事件
    writerStream.on('finish', function() {
    console.log("写入完成。");
    });
    writerStream.on('error', function(err) {
    console.log(err.stack);
    });

    运行前,请确保创建一个output.txt文件。

    管道流

    管道(pipe)提供了一种将数据从一个流传递到另一个流的机制。在数据处理中,管道常用于文件复制等场景。以下是典型的代码示例:

    var fs = require('fs');
    // 创建一个可读流
    var readerStream = fs.createReadStream('input.txt');
    // 创建一个可写流
    var writerStream = fs.createWriteStream('output.txt');
    // 用管道连接两个流
    readerStream.pipe(writerStream);

    这段代码会将input.txt文件的内容读取后,通过管道传递给并写入output.txt文件中。因此,无需手动处理数据,代码变得更加简洁。

    链式流

    链式流(pipeline)是通过连接输出流到另一个流并创建数据处理链节而实现的。在文件压缩和解压场景中,链式流特别有用。以下是一个压缩文件的示例:

    var fs = require('fs');
    var zlib = require('zlib');
    // 读取文件并通过压缩流链式传输到新文件中
    fs.createReadStream('input.txt')
    .pipe(zlib.createGzip())
    .pipe(fs.createWriteStream('input.txt.gz'));
    console.log("文件压缩完成。");

    相应的解压文件的代码如下:

    var fs = require('fs');
    var zlib = require('zlib');
    // 读取压缩文件并解压成新文件
    fs.createReadStream('input.txt.gz')
    .pipe(zlib.createGunzip())
    .pipe(fs.createWriteStream('inputdc.txt'));
    console.log("文件解压完成。");

    这两个示例展示了如何通过链式流高效地处理文件数据。

    总结

    通过本文的学习,我们发现Node.js中的Stream功能强大而灵活。从简单的文件读写到复杂的数据处理链式操作,Stream都是实现这些功能的核心工具。在实际开发中,合理使用Stream能够提升代码效率并处理大规模数据。

    转载地址:http://yqptz.baihongyu.com/

    你可能感兴趣的文章
    nova基于ubs机制扩展scheduler-filter
    查看>>
    Now trying to drop the old temporary tablespace, the session hangs.
    查看>>
    nowcoder—Beauty of Trees
    查看>>
    np.arange()和np.linspace()绘制logistic回归图像时得到不同的结果?
    查看>>
    np.power的使用
    查看>>
    NPM 2FA双重认证的设置方法
    查看>>
    npm build报错Cannot find module ‘webpack/lib/rules/BasicEffectRulePlugin‘解决方法
    查看>>
    npm build报错Cannot find module ‘webpack‘解决方法
    查看>>
    npm ERR! ERESOLVE could not resolve报错
    查看>>
    npm ERR! fatal: unable to connect to github.com:
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near '...on":"0.10.3","direc to'
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near ‘...“:“^1.2.0“,“vue-html-‘ npm ERR! A comp
    查看>>
    npm error Missing script: “server“npm errornpm error Did you mean this?npm error npm run serve
    查看>>
    npm error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装
    查看>>
    npm install CERT_HAS_EXPIRED解决方法
    查看>>
    npm install digital envelope routines::unsupported解决方法
    查看>>
    npm install 卡着不动的解决方法
    查看>>
    npm install 报错 EEXIST File exists 的解决方法
    查看>>
    npm install 报错 ERR_SOCKET_TIMEOUT 的解决方法
    查看>>
    npm install 报错 Failed to connect to github.com port 443 的解决方法
    查看>>