前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第七十四期:Node中的I/O操作(streams流)

第七十四期:Node中的I/O操作(streams流)

作者头像
terrence386
发布2022-07-15 10:49:34
2260
发布2022-07-15 10:49:34
举报

Node中的streams流

streams流是Node中的最好的特性之一。它在我们的开发过程当中可以帮助我们做很多事情。比如通过流的方式梳理大量数据,或者帮我们分离应用程序。

和streams流相关的内容有哪些呢?大致有这么几点:

  • 处理大量数据
  • 使用管道方法
  • 转换流
  • 读写流
  • 解耦I/O

处理大量数据

有一个很经典的问题:计算npm所有可使用的Node模块。

npm公开了一个HTTP节点,我们可以以JSON的形式获取npm注册表内容的全部内容。我们可以用一个请求试一下:

代码语言:javascript
复制
curl https://skimdb.npmjs.com/registry/_changes\?inclued_docs\=true

然后我们可以在终端看到不停的打印一个JSON。

我们可以写一段代码实现它。

代码语言:javascript
复制
var request = require('request')
var npmDb = 'https://skimdb.npmjs.com'
var registryUrl = `${npmDb}registry/_changes?_include_docs=true`

request(registryUrl, (err, data) => {
  if (err) console.log('err:', err)
  const numOfLine = data.split('\n').length + 1
  console.log('total modules on npm is:' + numOfLine)
})

如果我们执行上面的代码,我们会发现两个问题:

第一,这个请求要花很长时间。第二,请求的过程中有可能会报错。

这是因为,数据量太多,需要多一些内存去缓冲所有的数据。

尝试读写流

我们可以先用读写流来体会一下streams的用法。

代码语言:javascript
复制
// read.js
const fs = require('fs')
const rs = fs.createReadStream(__filename)
console.log('filename--', __filename)
rs.on('data', (data) => {
  console.log('读的数据:', data)
})

rs.on('end', () => {
  console.log('完成读写---->')
})

执行这个代码,它会将当前文件中的内容数据显示到终端上。

流的使用规则

通常情况下,我们创建流的时候应该尽量避免直接使用内置的streams模块。因为不同版本下它们的表现结果可能不太一致。我们可以使用与核心流模块相关的其他模块,比如fs,这样在未来的代码维护中,我们可以相对轻松一些。

流的类型

如果我们想创建一个让别人可以读的流,我们就用需要使用可读流。可读流的一个例子就是从硬盘上读取文件。

如果我们想创建一个可以写入文件的流,我们就需要使用可写流。可写流的一个例子就是往硬盘上存储文件。

有时候我们想要创建一个既可以读又可以写的流。这时候我们就需要使用双工流。双工流的一个例子就是TCP network。我们即可以从network上读取数据,又可以回复数据给它。

还有一种特殊的双工流叫转换流。它可以转换写入其中的数据,并使转换后的数据可从流中读出。转换流的一个例子GZIP。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaScript高级程序设计 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 处理大量数据
  • 尝试读写流
  • 流的使用规则
  • 流的类型
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档