理解 Node.js 中 Stream(流)

Stream(流) 是 Node.js 中处理流式数据的抽象接口。 stream 模块用于构建实现了流接口的对象。

Node.js 提供了多种流对象。 例如,对 HTTP 服务器的request请求process.stdout(标准输出), 都是流的实例。

流可以是可读的、可写的、或者可读可写的。 所有的流都是 EventEmitter 的实例。

Stream 的4种类型

1. Readable - 可读的流(fs.createReadStream())

2. Writable - 可写的流(fs.createWriteStream())

3. Duplex - 可读可写的流(net.Socket)

4. Transform - 操作被写入数据,然后读出结果。

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

data - 当有数据可读时触发

end - 没有更多的数据可读时触发

error - 在接收和写入过程中发生错误时触发

finish - 所有数据已被写入到底层系统时触发

实例 - 读写流(复制文件)

把文件 data.txt 中的内容复制到 copy.txt:

const fs = require('fs')
const path = require('path')

const fileName1 = path.resolve(__dirname, 'data.txt')
const fileName2 = path.resolve(__dirname, 'copy.txt')

// 创建一个可读流, 读取原文件的 stream 对象
const readStream = fs.createReadStream(fileName1)

// 创建一个可写流, 写入文件的 stream 对象
const writeStream = fs.createWriteStream(fileName2, {
    flags: 'a'  // a 表示追加写入, 如果需要覆盖写入,则用 'w'
})

// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readStream.pipe(writeStream)

// 逐渐的打印被读取的文件, 直到全部读取完成
readStream.on('data', chunk => {
    console.log(chunk.toString())
})

// 读取完成后执行
readStream.on('end', () => {
    console.log('全部复制完成')
})

从服务端读取文件内容

例如文件 data.txt 放在服务端,通过 get 请求读取:

const http = require('http')
const fs = require('fs')
const path = require('path')
const fileName1 = path.resolve(__dirname, 'data.txt')
const server = http.createServer((req, res) => {
    if (req.method === 'GET') {
        const readStream = fs.createReadStream(fileName1)
        readStream.pipe(res)
    }
})
server.listen(3333)

原文地址:https://www.cnblogs.com/cckui/p/10988971.html

时间: 2024-07-30 23:47:44

理解 Node.js 中 Stream(流)的相关文章

Node.js:Stream(流)

Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Stream 有四种流类型: Readable - 可读操作. Writable - 可写操作. Duplex - 可读可写操作. Transform - 操作被写入数据,然后读出结果. 所有的 Stream 对象都是 EventEmitter 的实例.常用的事件有: data - 当有数据可读时触发.

[Node.js] Node.js中的流

原文地址:http://www.moye.me/2015/03/29/streaming_in_node/ 什么是流? 说到流,就涉及到一个*nix的概念:管道——在*nix中,流在Shell中被实现为可以通过 |(管道符) 进行桥接的数据,一个进程的输出(stdout)可被直接作为下一个进程的输入(stdin). 在Node中,流(Stream)的概念与之类似,代表一种数据流可供桥接的能力. pipe 流化的精髓在于 .pipe()方法.可供桥接的能力,在于数据流的两端(上游/下游 或称为 读

深入理解 Node.js 中 EventEmitter源码分析(3.0.0版本)

events模块对外提供了一个 EventEmitter 对象,即:events.EventEmitter. EventEmitter 是NodeJS的核心模块events中的类,用于对NodeJS中的事件进行统一管理,使用events可以对特定的API事件进行添加,触发和移除等.我们可以通过 require('events')来访问该模块. 比如如下代码: // 引入 events 模块 const events = require('events'); console.log(events)

【node.js】Stream(流)

Stream 有四种流类型: Readable - 可读操作. Writable - 可写操作. Duplex - 可读可写操作. Transform - 操作被写入数据,然后读出结果. 所有的 Stream 对象都是 EventEmitter 的实例.常用的事件有: data - 当有数据可读时触发. end - 没有更多的数据可读时触发. error - 在接收和写入过程中发生错误时触发. finish - 所有数据已被写入到底层系统时触发. 从流中读取数据 创建 input.txt 文件,

笔记-Node.js中的核心API之HTTP

最近正在学习Node,在图书馆借了基本关于Node的书,同时在网上查阅资料,颇有收获,但是整体感觉对Node的理解还是停留在一个很模棱两可的状态.比如Node中的模块,平时练习就接触到那么几个,其他的一些模块暂时只会在学习的时候接触到,不常用便就荒废了.正所谓好记心不如烂笔头,多做笔记还是更有利于理解和记忆.自己做的总结也方便回头复习,所以决定踏上漫长的修炼之旅-- Node提供了许多API,其中一些比较重要.这些核心的API是所有Node应用的支柱,你会不停的用到他们. HTTP服务器 Nod

理解Node.js安装及模块化

1.安装Node Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Node.js 的包管理器 npm(Node Package Manage),是全球最大的开源库生态系统. 中文网:http://nodejs.cn/英文网:https://nodejs.org 2.REPL(交互式解释器) REPL(Read Eval Print Loop:交互式解释器),表示一个电脑的环境

方便大家学习的Node.js教程(一):理解Node.js

理解Node.js 为了理解Node.js是如何工作的,首先你需要理解一些使得Javascript适用于服务器端开发的关键特性.Javascript是一门简单而又灵活的语言,这种灵活性让它能够经受住时间的考验.函数.闭包等特性使Javascript成为一门适合Web开发的理想语言. 有一种偏见认为Javascript是不可靠的,然而事实并非如此.人们对Javascript的偏见来源于DOM,DOM是浏览器厂商提供的用于Javascript与浏览器交互的API,不同浏览器厂商实现的DOM存在差异.

【译】理解node.js事件轮询

Node.js的第一个基本论点是I/O开销很大. 当前编程技术中等待I/O完成会浪费大量的时间.有几种方法可以处理这种性能上的影响: 同步:每次处理一个请求,依次处理.优点:简单:缺点:任何一个请求都可以阻塞所有其他的请求. Fork一个新进程:开一个新进程来处理每个请求.优点:容易:缺点:不能很好的扩展,成百上千个连接意味着成百上千个进程.fork()函数相当于Unix程序员的锤子,因为它很有用,每个问题看起来就像一个钉子,通常会被过度使用.(译者注:直译比较拗口,我理解的意思是,Unix程序

Node.js中REST API使用示例——基于云平台+云服务打造自己的在线翻译工具

做为一个程序员可能在学习技术,了解行业新动态,解决问题时经常需要阅读英文的内容:而像我这样的英文小白就只能借助翻译工具才能理解个大概:不禁经常感慨,英文对学习计算机相关知识太重要了!最近发现IBM的云平台Blumemix,并且提供语言翻译的服务,感觉不错,就拿来研究学习一下:这里就分享一下我的研究学习过程,如何使用Node.js调用REST API打造自己的在线翻译工具,并演示如何把它发布到云平台上,让每个人都可以通过网络访问使用它. 应用效果展示 您可以通过点击效果图片的链接访问它. 构建一个