1 Star 0 Fork 0

ike_yu/myNode

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
stream.js 4.18 KB
一键复制 编辑 原始数据 按行查看 历史
ike_yu 提交于 2024-01-09 17:22 . '完成stream模块'
/*
* @Author: ike_yu ike_yu@qq.com
* @Date: 2024-01-09 13:46:55
* @LastEditors: ike_yu ike_yu@qq.com
* @LastEditTime: 2024-01-09 17:16:24
* @FilePath: \my_projectd:\my_test\myNode\stream.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
const stream = require('stream')
const fs = require('fs')
// 创建可读流
// const readable = new stream.Readable();
// 或者直接操作文件创建可读流
/* fs.createReadStream(path, [options])
* path: 文件路径
* options:可选项
* flags: 文件权限,默认为r
* encoding: 编码,默认为null
* fd:文件描述符,默认为null
* mode: 文件模式,默认为0o666
* autoClose: 出错或结束时自动关闭,默认true
* emitClose: 流销毁时发送close事件,默认true
* start: 指定开始读取的位置
* end: 指定结束读取的位置
* highWaterMark: 可读取的阈值,一般设成16-100kb间
*/
// 一、单工流
function fun1() {
// 可读流
const read = fs.createReadStream('./poems2.txt', {highWaterMark: 25})
// 可写流
const write = fs.createWriteStream('./poens1.txt', {flags: 'a'}) // 追加
read.setEncoding('utf8');
read.on('readable', () => {
while(null !== (chunk = read.read(25))) {
console.log(chunk)
}
})
read.on('data', (chunk) => {
console.log('chunk', chunk.toString())
read.pause() // 暂停data事件
console.log('ispaused', read.isPaused()) // 是否暂停
setTimeout(() => {
read.resume() // 恢复data事件
console.log('ispaused', read.isPaused()) // 是否暂停
}, 1000)
})
// 可写流对象绑定可读流对象
read.pipe(write)
// 写入流写入数据
write.write("\n鉴赏:写的好! \n", 'utf8')
read.on('close', () => {
read.unpipe(write) // 可写流解绑可读流
read.destroy() // 销毁流
write.end() // 关闭可写流
console.log('读取完毕')
})
}
// fun1()
function fun2() {
const writeable = new stream.Writable({
write: function(chunk, encoding, next) {
console.log('chunk', chunk.toString())
next()
}
})
writeable.write('天气晴朗')
writeable.cork() // 之后写入的数据存入内存
writeable.write('阳光明媚')
writeable.write('好天气呀')
writeable.uncork() // 写入的内存数据写入目标处
writeable.end()
writeable.on('finish', () => {
writeable.destroy()
})
}
// fun2()
// 二、双工流
function funTwo1() {
const duplex = stream.Duplex()
duplex._read = function() { // 会自动调用
this.push('读取数据')
this.push(null) // 数据完结,触发end事件
}
duplex._write = function(data, encoding, next) {
console.log('write ',data.toString());
next()
}
duplex.on('data', (data) => {
console.log('读取的数据', data.toString())
})
duplex.on('end', data => {
console.log('读取完成')
})
duplex.write('写入的数据')
duplex.end() // 写入完成,触发finish事件
duplex.on('finish', () => console.log('写入完成'))
}
// funTwo1()
// 三、转换流(一种特殊双工流)
// 可读流的数据经过处理进入可写流
function funThree1() {
class TransformReverse extends stream.Transform{
constructor() {
super()
}
_transform(data, encoding, callback) {
// 处理数据
const res = data.toString().split('').reverse().join('')
this.push(res)
callback()
}
}
const transform = new TransformReverse()
transform.on('data', data => {
console.log('读取到数据', data.toString())
})
transform.on('end', data => { // 只会执行一次
console.log('读取完成')
})
transform.write('写入数据ABCD')
transform.write('写入数据ABCE')
transform.end() // 触发写入结束、读取结束
transform.on('finish', () => {
console.log('写入完成')
})
}
funThree1()
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/ike_yu/my-node.git
git@gitee.com:ike_yu/my-node.git
ike_yu
my-node
myNode
master

搜索帮助