跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
JavaScript Node.js流
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:JavaScript Node.js流}} '''Node.js流(Streams)'''是Node.js核心模块中处理流式数据的抽象接口,用于高效处理大量数据(如文件、网络通信等)。流将数据分割成小块(chunks)并按顺序处理,避免内存溢出,适用于I/O密集型操作。 == 流的基本类型 == Node.js提供四种基础流类型: * '''可读流(Readable)''':数据来源(如文件读取、HTTP请求)。 * '''可写流(Writable)''':数据目标(如文件写入、HTTP响应)。 * '''双工流(Duplex)''':既可读又可写(如TCP套接字)。 * '''转换流(Transform)''':在读写过程中修改数据(如压缩流)。 <mermaid> flowchart LR A[可读流] -->|读取数据| B[可写流] C[双工流] -->|双向通信| D[转换流] </mermaid> == 流的工作模式 == 流有两种工作模式: # '''流动模式(Flowing)''':数据自动通过事件推送。 # '''暂停模式(Paused)''':需手动调用<code>read()</code>读取数据。 === 示例:可读流 === <syntaxhighlight lang="javascript"> const fs = require('fs'); const readableStream = fs.createReadStream('input.txt'); // 流动模式 readableStream.on('data', (chunk) => { console.log(`接收到 ${chunk.length} 字节数据`); }); readableStream.on('end', () => { console.log('数据读取完成'); }); </syntaxhighlight> '''输出'''(假设文件内容为"Hello Node.js"): <pre> 接收到 13 字节数据 数据读取完成 </pre> == 管道(Pipe) == 管道用于将可读流的数据直接导向可写流,简化代码: <syntaxhighlight lang="javascript"> const fs = require('fs'); const zlib = require('zlib'); // 文件压缩示例 fs.createReadStream('input.txt') .pipe(zlib.createGzip()) .pipe(fs.createWriteStream('input.txt.gz')); </syntaxhighlight> == 实际应用场景 == * '''大文件处理''':分块读取/写入避免内存不足。 * '''实时数据传输''':视频流、日志处理。 * '''数据转换''':加密/压缩流。 === 案例:HTTP服务器流 === <syntaxhighlight lang="javascript"> const http = require('http'); const fs = require('fs'); http.createServer((req, res) => { fs.createReadStream('largefile.pdf').pipe(res); // 高效发送大文件 }).listen(3000); </syntaxhighlight> == 错误处理 == 流通过<code>error</code>事件处理异常: <syntaxhighlight lang="javascript"> readableStream.on('error', (err) => { console.error('流发生错误:', err); }); </syntaxhighlight> == 性能优化 == * 使用<code>highWaterMark</code>调整缓冲区大小。 * 避免“背压”(Backpressure)问题,监听<code>drain</code>事件控制写入速度。 === 背压处理示例 === <syntaxhighlight lang="javascript"> const writableStream = fs.createWriteStream('output.txt'); readableStream.on('data', (chunk) => { if (!writableStream.write(chunk)) { readableStream.pause(); // 暂停读取直到可写流准备好 } }); writableStream.on('drain', () => { readableStream.resume(); // 恢复读取 }); </syntaxhighlight> == 总结 == Node.js流通过分块处理和管道机制优化I/O性能,适用于大规模数据场景。掌握流的核心类型、事件和错误处理是构建高效应用的关键。 {{Stub}} [[Category:编程语言]] [[Category:JavaScript]] [[Category:Javascript Node.js基础]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Stub
(
编辑
)