前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Nodejs基础:stream模块入门介绍与使用

Nodejs基础:stream模块入门介绍与使用

作者头像
IMWeb前端团队
发布于 2017-12-28 10:12:53
发布于 2017-12-28 10:12:53
1.1K00
代码可运行
举报
文章被收录于专栏:IMWeb前端团队IMWeb前端团队
运行总次数:0
代码可运行

模块概览

nodejs的核心模块,基本上都是stream的的实例,比如process.stdout、http.clientRequest。

对于大部分的nodejs开发者来说,平常并不会直接用到stream模块,只需要了解stream的运行机制即可(非常重要)。

而对于想要实现自定义stream实例的开发者来说,就得好好研究stream的扩展API了,比如gulp的内部实现就大量用到了自定义的stream类型。

来个简单的例子镇楼,几行代码就实现了读取文件内容,并打印到控制台:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const fs = require('fs');

fs.createReadStream('./sample.txt').pipe(process.stdout);

Stream分类

在nodejs中,有四种stream类型:

  • Readable:用来读取数据,比如 fs.createReadStream()
  • Writable:用来写数据,比如 fs.createWriteStream()
  • Duplex:可读+可写,比如 net.Socket()
  • Transform:在读写的过程中,可以对数据进行修改,比如 zlib.createDeflate()(数据压缩/解压)。

Readable Stream

以下都是nodejs中常见的Readable Stream,当然还有其他的,可自行查看文档。

  • http.IncomingRequest
  • fs.createReadStream()
  • process.stdin
  • 其他

例子一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var fs = require('fs');

fs.readFile('./sample.txt', 'utf8', function(err, content){
    // 文件读取完成,文件内容是 [你好,我是程序猿小卡]
    console.log('文件读取完成,文件内容是 [%s]', content);
});

例子二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var fs = require('fs');

var readStream = fs.createReadStream('./sample.txt');
var content = '';

readStream.setEncoding('utf8');

readStream.on('data', function(chunk){
    content += chunk;
});

readStream.on('end', function(chunk){
    // 文件读取完成,文件内容是 [你好,我是程序猿小卡]
    console.log('文件读取完成,文件内容是 [%s]', content);
});

例子三:

这里使用了.pipe(dest),好处在于,如果文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var fs = require('fs');

fs.createReadStream('./sample.txt').pipe(process.stdout);

注意:这里只是原封不动的将内容输出到控制台,所以实际上跟前两个例子有细微差异。可以稍做修改,达到上面同样的效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var fs = require('fs');

var onEnd = function(){
    process.stdout.write(']');    
};

var fileStream = fs.createReadStream('./sample.txt');
fileStream.on('end', onEnd)

fileStream.pipe(process.stdout);

process.stdout.write('文件读取完成,文件内容是[');

// 文件读取完成,文件内容是[你好,我是程序猿小卡]

Writable Stream

同样以写文件为例子,比如想将hello world写到sample.txt里。

例子一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var fs = require('fs');
var content = 'hello world';
var filepath = './sample.txt';

fs.writeFile(filepath, content);

例子二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var fs = require('fs');
var content = 'hello world';
var filepath = './sample.txt';

var writeStram = fs.createWriteStream(filepath);
writeStram.write(content);
writeStram.end();

Duplex Stream

最常见的Duplex stream应该就是net.Socket实例了,在前面的文章里有接触过,这里就直接上代码了,这里包含服务端代码、客户端代码。

服务端代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var net = require('net');
var opt = {
    host: '127.0.0.1',
    port: '3000'
};

var client = net.connect(opt, function(){
    client.write('msg from client');  // 可写
});

// 可读
client.on('data', function(data){
    // server: msg from client [msg from client]
    console.log('client: got reply from server [%s]', data);
    client.end();
});

客户端代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var net = require('net');
var opt = {
    host: '127.0.0.1',
    port: '3000'
};

var client = net.connect(opt, function(){
    client.write('msg from client');  // 可写
});

// 可读
client.on('data', function(data){
    // lient: got reply from server [reply from server]
    console.log('client: got reply from server [%s]', data);
    client.end();
});

Transform Stream

Transform stream是Duplex stream的特例,也就是说,Transform stream也同时可读可写。跟Duplex stream的区别点在于,Transform stream的输出与输入是存在相关性的。

常见的Transform stream包括zlibcrypto,这里举个简单例子:文件的gzip压缩。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var fs = require('fs');
var zlib = require('zlib');

var gzip = zlib.createGzip();

var inFile = fs.createReadStream('./extra/fileForCompress.txt');
var out = fs.createWriteStream('./extra/fileForCompress.txt.gz');

inFile.pipe(gzip).pipe(out);

相关链接

https://nodejs.org/api/stream.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
2025 年 Java 核心技术实战指南之从入门到精通实用技巧详解
以上内容涵盖了2025年Java开发中的核心技术和最佳实践,包括语言新特性、微服务架构、响应式编程、容器化部署等方面。通过这些实战案例,你可以深入理解Java技术栈的最新发展,并将其应用到实际项目中。
啦啦啦191
2025/06/13
750
2025 年 Java 核心技术实战指南之从入门到精通实用技巧详解
2025 年 Java 校招面试全攻略之面试心得与指南
以下是结合最新技术趋势的Java校招面试实操指南,包含技术方案和可直接运行的代码实例:
啦啦啦191
2025/06/24
350
2025 年 Java 校招面试全攻略之面试心得与指南
最新 Java 从入门到实战技术实操指南
以下是结合最新技术的Java实操内容,涵盖从基础到微服务架构的完整学习路径和应用实例:
啦啦啦191
2025/06/20
660
最新 Java 从入门到实战技术实操指南
2025 年 Java 核心技术全面升级与实战应用解析
以下是结合最新技术的Java校招实操内容,包含技术方案和应用实例,帮助你应对企业级开发需求:
啦啦啦191
2025/06/07
1310
2025 年 Java 核心技术全面升级与实战应用解析
2025 版一线互联网大厂 Java 面试题深度剖析与实战攻略
以上是基于最新Java技术的实操内容,涵盖了Java 17/21新特性、云原生、AI融合等方向。如果你需要更详细的代码实现或特定技术的深入讲解,可以指定具体章节进行扩展。
啦啦啦191
2025/06/07
1020
2025 版一线互联网大厂 Java 面试题深度剖析与实战攻略
Java 学习路线之环境搭建微服务项目实战及 DevOps 流程实操内容
以下是结合最新技术的Java学习路线实操内容,包含环境搭建、微服务项目实战及DevOps流程:
啦啦啦191
2025/06/11
1610
Java 学习路线之环境搭建微服务项目实战及 DevOps 流程实操内容
Java 零基础入门实操指南 2025 版之新手自学实战教程
以下是结合最新技术的Java零基础入门实操指南,包含环境配置、模块化开发和容器化部署等内容:
啦啦啦191
2025/06/23
770
Java 零基础入门实操指南 2025 版之新手自学实战教程
2025 春季校招 Java 研发笔试题详细解析及高效学习指南
Java 17引入了更强大的模式匹配功能,包括instanceof模式匹配和switch表达式的模式匹配。这使得代码更加简洁和安全。
啦啦啦191
2025/06/04
820
2025 春季校招 Java 研发笔试题详细解析及高效学习指南
2025 年 Java 面试宝典社招春招秋招实操全攻略
以下是一份基于相关技术平台文章整合的2025年Java面试宝典内容,包含技术方案和应用实例,帮助你应对社招、春招和秋招:
啦啦啦191
2025/06/26
160
2025 年 Java 面试宝典社招春招秋招实操全攻略
Spring Boot 3 微服务架构实战 云原生电商平台全流程构建
通过上述技术组合,我们可以构建一个现代化、高可用的云原生电商平台。未来发展方向包括:
啦啦啦191
2025/06/20
970
Spring Boot 3 微服务架构实战 云原生电商平台全流程构建
SpringCloud实战: Feign<上>
很多使用spring cloud 主要是注册中心,动态配置中心,服务调用,负载均衡,熔断,网关。Feign是一个声明式的Web Service客户端,整合了注解,所以使用起来比较方便,通过它调用HTTP请求访问远程服务,就像访问本地方法一样简单开发者完全无感知。
田维常
2019/07/16
4590
使用Spring Cloud Feign调用RESTful API(二)
在默认情况下,Feign会使用Java原生的HttpURLConnection发送HTTP请求。但是,我们可以通过配置来改变这个行为。例如,我们可以使用OkHttp作为HTTP客户端,可以设置超时时间和重试次数等。下面是一个示例:
堕落飞鸟
2023/04/08
6720
【互联网一线大厂 Java 程序员面试 + 学习指南】包含 Java 程序员所需大部分面试知识点与技巧及最新技术实操内容
Deployment配置示例(user-service-deployment.yaml)
啦啦啦191
2025/06/08
720
【互联网一线大厂 Java 程序员面试 + 学习指南】包含 Java 程序员所需大部分面试知识点与技巧及最新技术实操内容
浅谈Spring Cloud OpenFeign
解决映射名称不一致问题(提交请求参数的action的形参名称不一致,使用@RequestParam注解解析)
QGS
2023/10/05
1.2K0
SpringCloud声明式服务调用Feign
1.创建一个SpringBoot工程,这里命名为feign-consumer,然后在pom文件中添加依赖:
林老师带你学编程
2019/05/25
5130
2025 版 Java 学习路线图之技术方案与实操指南详解
以下是一篇详细的Java学习路线图文章,涵盖了技术方案和部分应用实例,帮助你系统地学习Java:
啦啦啦191
2025/06/11
2820
2025 版 Java 学习路线图之技术方案与实操指南详解
Spring Cloud Sleuth进阶实战
方志朋
2017/12/29
2.8K0
Spring Cloud Sleuth进阶实战
Spring Boot 项目从入门到精通实操教程
下面我将基于Spring Boot 3.2和Java 17,使用最新的技术栈和最佳实践,为你提供一个完整的Spring Boot项目实操教程。
啦啦啦191
2025/06/14
5250
Spring Boot 项目从入门到精通实操教程
Spring Cloud 入门手册
Spring Cloud 是一系列框架的集合。他利用 SpringBoot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用 SpringBoot 的开发风格做到一键启动和部署。Spring Cloud 并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过 SpringBoot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
用户11332765
2024/10/28
2890
Spring Cloud 入门手册
SpringCloud-实用篇
小简从 0 开始学 Java 知识之 Java-学习路线 中的《SpringCloud-实用篇》,不定期更新所学笔记,期待一年后的蜕变吧!<有同样想法的小伙伴,可以联系我一起交流学习哦!>
小简
2023/01/30
1.7K0
推荐阅读
相关推荐
2025 年 Java 核心技术实战指南之从入门到精通实用技巧详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档