- 文件可读流
- 文件可写流
- write执行流程
- 背压机制
文件可读流
const fs = require('fs')
// 文件可读流的创建
let rs = fs.createReadStream('test.txt', {
flag: 'r',
encoding: null,
fd: null,
mode: 438, // 十进制
start: 0,
// end: 3,
highWaterMark: 4 // 每次读字节的次数
})
// 文件可读流消费--data
// rs.on('data', (chunk) => {
// console.log(chunk.toString())
// // rs.pause() // 暂停数据读取
// // setTimeout(() => {
// // rs.resume() // 恢复数据读取
// // }, 1000)
// })
// 文件可读流消费--readable
// rs.on('readable', () => {
// // let data = rs.read()
// let data
// // console.log(data)
// // 最后读取完是null
// while((data = rs.read(1)) !== null) {
// console.log(data.toString())
// console.log('----', rs._readableState.length) // rs._readableState.length标识缓存区里的字节
// }
// })
// 文件可读流事件
rs.on('open', (fd) => {
console.log('文件打开了', fd)
})
rs.on('close', (fd) => {
// 文件读取完默认是暂停的状态,不会被关闭
console.log('文件关闭了', fd)
})
let bufferArr = []
rs.on('data', (chunk) => {
// 数据消费后,文件会被关闭
console.log(chunk)
bufferArr.push(chunk)
})
rs.on('end', () => {
console.log('当数据被清空之后')
console.log(Buffer.concat(bufferArr).toString()) // 拼接buffer数据
})
rs.on('error', (err) => {
console.log('出错了')
})
文件可写流
const fs = require('fs')
const ws = fs.createWriteStream('test.txt', {
flags: 'w',
mode: 438,
fd: null,
encoding: 'utf-8',
start: 0,
highWaterMark: 3
})
// ws.write 可以多次调用,且先调用的先执行, 第一个参数是字符串或是buffer
// ws.write('lalala', () => {
// console.log('数据写完了1')
// })
// ws.write('llllll', () => {
// console.log('数据写完了2')
// })
ws.on('open', (fd) => {
console.log('文件打开了', fd)
})
ws.write('0000', () => {
console.log('数据写完了000')
})
ws.on('close', (fd) => { // 文件写入操作完成后触发
console.log('文件关闭了', fd)
})
ws.end() // 执行代表写入完成
ws.on('end', () => { // 执行之后意味着数据写入操作完成
console.log('当数据被清空之后')
})
// ws.write(1, () => { // 验证报错
// console.log('数据写完了000')
// })
ws.on('error', (err) => {
console.log('出错了')
})
write执行流程和限流
const fs = require('fs')
const ws = fs.createWriteStream('test.txt', {
highWaterMark: 3// 设置3是可能出现中文,避免乱码
})
let flag = ws.write('1')
flag = ws.write('2')
flag = ws.write('3')
// 限流代码。。。
const fs = require('fs')
const ws = fs.createWriteStream('test.txt', {
highWaterMark: 3// 设置3是可能出现中文,避免乱码
})
let source = '张三李四'.split('')
let num = 0
let flag = true
function executeWrite() {
flag = true
while(num!== 4 && flag) {
flag = ws.write(source[num])
num++
}
}
executeWrite()
ws.on('drain', () => {
console.log('drain触发了')
executeWrite()
})
-背压机制
nodejs的stream已实现了背压机制