[node] Node.js 中Stream流

[node] Node.js 中Stream流

  • 什么是 Stream
  • 流操作
    • 从流中读取数据
    • 写入流
    • 管道流
    • 链式流

什么是 Stream

Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)

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

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

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

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

流操作

从流中读取数据

input.txt

Test read by stream

main.js

var fs = require("fs");
var data = '';// 创建可读流
var readerStream = fs.createReadStream('input.txt');
// 设置编码为 utf8
readerStream.setEncoding('UTF8');
// 处理流事件 --> data, end, and error
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("程序执行完毕");
//输出://程序执行完毕
//Test read by stream

写入流

main.js

var fs = require("fs");
var data = 'Test for write ';// 创建一个可以写入的流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt');// 使用 utf8 编码写入数据
writerStream.write(data,'UTF8');// 标记文件末尾
writerStream.end();// 处理流事件 --> finish、error
writerStream.on('finish', function() {console.log("写入完成。");
});writerStream.on('error', function(err){console.log(err.stack);
});console.log("程序执行完毕");
//程序执行完毕
//写入完成。

生成的output.txt,在执行命令的路径下,不在执行的文件夹所在路径下,内容为:

Test for write 

管道流

管道提供了一个输出流到输入流的机制。通常用于从一个流中获取数据并将数据传递到另外一个流中

在这里插入图片描述

如上面的图片所示,把文件比作装水的桶,而水就是文件里的内容,用一根管子(pipe)连接两个桶使得水从一个桶流入另一个桶,这样就慢慢的实现了大文件的复制过程。

以下实例我们通过读取一个文件内容并将内容写入到另外一个文件中。

设置 input.txt 文件如下:

管道流操作实例

创建main.js 文件,并执行:

var fs = require("fs");
// 创建一个可读流
var readerStream = fs.createReadStream('input.txt');
// 创建一个可以写入的流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt');// 管道读写操作
// 读取 input.txt 文件内容,写入到 output.txt 文件中
readerStream.pipe(writerStream);console.log("程序执行完毕");
//程序执行完毕

查看output.txt文件:

管道流操作实例

链式流

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

下面是用管道和链式来压缩和解压文件的实例。

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

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。

接下来,解压该文件,创建 decompress.js 文件:

var fs = require("fs");
var zlib = require('zlib');// 解压 input.txt.gz 文件为 input.txt
fs.createReadStream('input.txt.gz').pipe(zlib.createGunzip()).pipe(fs.createWriteStream('input.txt'));console.log("文件解压完成。");
//执行后输出:
//文件解压完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/183280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SCI的写作前提——认识论文的本质

论文可以被视为证据和支持性解释的集合;也就是说,试图说服他人分享你的结论 1.假设 在大纲中,一个示例研究程序可以如下进行。 ● 研究算法的研究人员可能会推测是否有可能更好地利用CPU上的缓存来降低计算成本。 ● 初步研究可能会导致这样…

(C++)复写零--双指针法

个人主页:Lei宝啊 愿所有美好如期而遇 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://le…

【500强 Kubernetes 课程】第4章 dockerfile基础篇-基本语法

【读书笔记-首页】基于世界500强的高薪实战Kubernetes课程 第4章 dockerfile基础篇-基本语法 dockerfile:构建镜像的文本文件 1、FROM 作用:基础镜像来源 2、MAINTAINER 作用:作者信息 3、RUN 作用:构建过程中运行的命令 …

Firewalld端口富规则——删除默认开放的服务

在Redhat8.6中,firewalld默认开放了ssh、cockpit、dhcpv6-client三个服务的端口富规则。如果想把默认开放的服务关掉可以执行下面的命令: firewall-cmd --permanent --remove-servicessh firewall-cmd --permanent --remove-servicecockpit firewall-cmd…

ESP32-Web-Server 实战编程- 使用 AJAX 自动更新网页内容

ESP32-Web-Server 实战编程- 使用 AJAX 自动更新网页内容 概述 什么是 AJAX ? AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 AJAX 是一种用于创建快速动态网页的技术。 传统的网页(不使用 AJAX&#…

PHP如何实现邮箱验证

在PHP中,提供了 mail() 函数用于发送邮件。使用该函数需要设置邮件头信息、收件人地址、邮件主题和邮件内容等参数。下面是一个简单的使用示例: $to 收件邮箱; $subject 邮件主题; $message 邮件内容; $from 发件邮箱; $headers "From: $from…

Linux 进程(一)

1 操作系统 概念:任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括 内核(进程管理,内存管理,文件管理,驱动管理) 其他程序(例…

linux安装docker(脚本一键安装配置docker)

1、创建脚本 vi initDocker.sh #安装前先更新yum,防止连接镜像失败 yum -y update#卸载系统之前的docker(可选择,我这里直接注释了) #yum remove docker docker-client docker-client-latest docker-common docker-latest docke…

Go 谈论了解Go语言

一、引言 Go的历史回顾 Go语言(通常被称为Go或Golang)由Robert Griesemer、Rob Pike和Ken Thompson在2007年开始设计,并于2009年正式公开发布。这三位设计者都曾在贝尔实验室工作,拥有丰富的编程语言和操作系统研究经验。Go的诞生…

android开发:子线程更新UI界面

多线程操作经常希望在子线程更新界面,这样方便调试,但是,但是经常这样做程序就不对劲了,为什么呢?因为为了保证界面流畅,不允许在非UI线程直接操作界面,只能通过一些专门途径进行。另外&#xf…

Wordpress自动定时发布怎么开通-Wordpress怎么自动发布原创文章

在当今数字化时代,博客已经成为许多人分享观点、经验和知识的重要平台。然而,对于博主们来说,每天按时发布一篇又一篇的文章可能是一项具有挑战性的任务。为了解决这个问题,一些创新的工具应运而生,其中包括WordPress的…

vuepress-----4、侧边栏

# 4、侧边栏 # 自动生成侧栏 如果你希望自动生成一个仅仅包含了当前页面标题(headers)链接的侧边栏,你可以通过 YAML front matter 来实现: --- sidebar: auto ---你也可以通过配置来在所有页面中启用它: // .vuep…

深入探索 Vue 响应式原理:数据驱动视图的奥秘

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Docker快速创建一个单机版的Jenkins实例

谈到 CI/CD,那便少不了这里面的佼佼者 Jenkins,正如 Jenkins 官网说的一样:“Build great things at any scale”,构建伟大,无所不能! 话不多说,该篇文章将会带你使用 Docker 快速创建一个单机…

COGVLM论文解读(COGVLM:VISUAL EXPERT FOR LARGE LANGUAGE MODELS)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、摘要二、引言三、模型方法1、模型思路2、融合公式 四、训练方法总结 前言 2023年5月18日清华&智谱AI发布并开源VisualGLM-6B以来,清华KEG&…

C++多线程-传递普通变量,指针,引用给线程

注意点&#xff1a; 1、传递空间已销毁 2、多线程共享一块内存 3、传递的指针变量的生命周期小于线程 #include <iostream> #include <thread> #include <string> #include <unistd.h>using namespace std;class Para {public:Para(){cout<<…

Linux搭建FTP并安装xrdp,实现Windows系统下利用FileZilla传输文件和远程桌面连接

一、实现FTP文件传输 1、搭建FTP服务器&#xff1a; sudo apt-get install vsftpd sudo service vsftpd status 2、查看vsftpd是否正在运行&#xff0c;并监听21端口 netstat -npl | grep :21 or sudo service vsftpd status # 查看 vsftpd 服务状态 3、配置vsftpd.conf sud…

4.6-容器的端口映射

首先&#xff0c;我们来拉取Nginx的image镜像。 docker pull nginx 接下来我们创建一个Nginx的容器。 docker run --name nginx -d nginx 但是&#xff0c;这样启动nginx容器的话我们没法访问。这个时候怎么办呢&#xff1f;就需要将Nginx这个服务暴露给外面的世界。 这时可以使…

yum命令详解

yum命令详解 文章目录 yum命令详解1. yum介绍2. yum使用说明3. yum命令的常见使用 1. yum介绍 yum&#xff08;全称为Yellow dogUpdater, Modified&#xff09;是一个在Fedora、RedHat以及CentOS中的软件包管理器&#xff0c;基于RPM包管理&#xff0c;能够从指定的服务器自动…

【C++】POCO学习总结(八):通知Notifications和事件Events

【C】郭老二博文之&#xff1a;C目录 1、Notifications和Events的区别 1&#xff09;通知Notifications&#xff1a;如果观察者不知道或不关心事件的来源&#xff0c;则使用通知Notifications。 Poco::NotificationCenter或Poco::NotificationQueue位于源source和目标target之…