Buffer&Fs&Stream

204 阅读1分钟

什么是buffer

buffer就是一个字节数组,一个字节8位,就是一个16进制数组

buffer的api

# 定义buffer
1. const buf1 = Buffer.alloc(10);
2. const buf2 = Buffer.from([1, 2, 3]);
3. const buf3 = Buffer.from('yyc');

# 常用方法
1. buffer.toString()
2. buffer.slice()
3. Buffer.concat([buf1, buf2])

fs

# readFile
fs.readFile(path[, options], callback)
options: {
    encoding
    flag flag 默认 = 'r'
}

# writeFile
fs.writeFile(file, data[, options], callback)
options: {
    encoding
    flag flag 默认 = 'w'
    mode 读写权限,默认为0666
}

# appendFile
fs.appendFile(file, data[, options], callback)

# watchFile
fs.watchFile(filename[, options], listener)

Stream

  1. 流是一组有序的,有起点和终点的字节数据传输手段
  2. 它不关心文件的整体内容,只关注是否从文件中读到了数据,以及读到数据之后的处理
  3. 流是一个抽象接口,被 Node 中的很多对象所实现。比如HTTP 服务器request和response对象都是流。
// 可读流
createReadStream
fs.createReadStream(path, [options])
options: {
    flags打开文件要做的操作,默认为'r'
    encoding默认为null
    start开始读取的索引位置
    end结束读取的索引位置(包括结束位置)
    highWaterMark读取缓存区默认的大小64kb

}

监听data事件
rs.on('data', function (data) {
    console.log(data);
});

监听end事件
rs.on('end', function () {
    console.log('读取完成');
});

监听error事件
rs.on('error', function (err) {
    console.log(err);
});

// 可写流
fs.createWriteStream(path, options)
options: {
    flags打开文件要做的操作,默认为'w'
    encoding默认为utf8
    highWaterMark写入缓存区的默认大小16kb
}

pipe实现

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

let rs = fs.createReadStream(path.resolve('1.html'))
let ws = fs.createWriteStream(path.resolve('2.html'))

rs.on('data', (data) => {
  let ret = ws.write(data)
  if (!ret) {
    rs.pause()
  }
})

ws.on('drain', () => {
  rs.resume()
})

rs.on('end', () => {
  ws.end()
})

流的四种类型

Readable - 可读的流 (例如 fs.createReadStream()).
Writable - 可写的流 (例如 fs.createWriteStream()).
Duplex - 可读写的流 (例如 net.Socket).
Transform - 在读写过程中可以修改和变换数据的 Duplex 流 (例如 zlib.createDeflate()).