node可读流用法

82 阅读1分钟
//服务端可以操作二进制 Buffer 可以和字符串进行相互转化
// Buffer代表端都是二进制数据 内存 (buffer不能扩容)


//1.buffer的三种声明方式 通过长度来声明(大小)
const buffer = Buffer.alloc(5) //开发中数字都是字节为单位
const buffer1 = Buffer.from('汉字') //根据汉字来转化成buffer
const buffer2 = Buffer.from([0x16,0x32]) //通过数组来知道存放的内容

console.log(buffer1.length) // 6

//不具备 扩展push shift等方法
let buf = buffer.slice(0,1) //slice 方法是‘浅拷贝’
buf[0] = 100
console.log(buffer) // <Buffer 64 00 00 00 00>

//文件操作  索引 修改内容


//slice() 截取一段
//length 获取长度
//Buffer.isBuffer 判断是否是Buffer类型
//copy buffer的拷贝 
//concat buffer的拼接 参数 两个  第一个是buffer的数组,第二个是长度可以不穿




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

let rs = fs.createReadStream(path.resolve(__dirname, 'name.txt'), {
    flags: 'r', //r代表读取
    encoding: null,//默认buffer
    mode: 0o666, //模式可读可写
    autoClose: true,//fs.close
    start: 0,// 0 包前
    end: 8,//包后
    highWaterMark: 3 //每次读取的个数
})

//为了多个异步方法解偶,发布订阅模式
//可读流继承流events模块,这里的名字必须叫data,rs.emit('data'),如果监听了data就会拼命的读取文件的内容,触发对应的回调
//Buffer.concat()
let bufferArr = []
rs.on('data', (data) => { //默认会直到文件读取完毕
    rs.pause()//可读流暂停触发data事件
    setTimeout(() => {
        rs.resume() //可读流重新启动
    }, 1000)
    console.log(data)
    bufferArr.push(data)
})

//文件读取完成
rs.on('end', data => {
    Buffer.concat(bufferArr)
})
//文件读取出错
rs.on('error', err => {
    console.log(err)
})

//文件流有此方法
rs.on('close', () => {

})
//文件流有此方法
rs.on('open', () => {

})