Buffer缓冲器


Buffer缓冲器

Buffer是什么

Buffer是一个和数组类似的对象,不同是Buffer是专门用来保存二进制数据的。

Buffer特点

  1. 它是一个类似于数组的对象,用于存储数据(存储的是二进制数据)

  2. Buffer的效率很高,存储和读取很快,它是直接对计算机的内存进行操作

  3. 每个元素大小为1字节(byte)

  4. Buffer大小一旦确定了,不可修改

  5. Buffer是Node中的非常核心的模块,无需下载,无需引入,直接即可使用

创建

//创建一个Buffer的实例对象------性能特别差--1.在堆里开辟空间2.清理
let buf = new Buffer(10)
console.log(buf)
//创建一个Buffer实例对象-------性能比new Buffer()稍强一点点-----在堆中开辟一块空间(该块空间没有人)
let buf2 = Buffer.alloc(10)
console.log(buf2)
//创建一个Buffer实例对象-------性能最好的----在堆里开辟空间
let buf3 = Buffer.allocUnsafe(10)
console.log(buf3)

输出的Buffer为什么不为空?

在堆里开辟空间,可能残留着别人用过的数据,所以allocUnsafe

将一个数据存入

let buf4 = Buffer.from('hello atguigu')
console.log(buf4)

Node简单文件写入

简单文件写入

1.Node中的文件系统:

1.NodeJs中有一个文件系统,所谓的文件系统,就是对计算机中的文件进行增删改查等操作

2.在NodeJs中,给我们提供一个模块,叫做fs模块,专门用于操作文件

3.fs模块是Node的核心模块,使用的时候,无需下载,直接引入

2.异步文件写入(简单文件写入)

fs.writeFile(file,data[,options],callback)

  • file:要写入文件路径+文件名

  • data:要写入的数据

  • options:可选参数(可选参数)

    • encoding:设置文件的编码方式,默认值'utf8'

    • mode:设置文件的操作权限,默认值0o666=0o222+0o444

      • 0o111:文件可被执行的权限
      • 0o222:文件可被写入的权限
      • 0o444:文件可被读取的权限
    • flag:打开文件要执行的操作, 默认值: 'w'

      • a:追加
      • w:写入
    • signal allows aborting an in-progress writeFile

  • callback:回调函数

    • err:错误对象

在Node中有这样一个原则:错误优先

//引入内置的fs模块
let fs = require('fs')

//调用writeFile方法
fs.writeFile('./demo.txt','今天天气真不错',(err)=>{
    if(err){
        console.log('文件写入失败',err)
    }else{
        console.log('文件写入成功')
    }
})

流式文件写入

fs.createWriteStream(path[,optoions])

  • path:要写入文件的路径+文件名+文件后缀
  • options:配置对象(可选参数)
    • flags:打开文件要执行的操作, 默认值: 'w'
    • encoding:设置文件的编码方式,默认值'utf8'
    • fd:文件统一标识符,Linux下文件标识符
    • mode:
    • autoClose:自动关闭—文件,默认值:true
    • emitClose:强制关闭—文件,默认值:false
    • start:写入文件的起始位置(偏移量)
let fs = require('fs')
//创建可写流
let ws = fs.createWriteStream(__dirname+'/demo.txt')

//监测流的状态
ws.on('open',function(){
    console.log('可写流打开了')
})
ws.on('close',function(){
    console.log('可写流关闭了')
})

//使用可写流写入数据
ws.write('美女\n')
ws.write('没诶诶诶\n')
ws.write('到底是哪一个\n')
ws.close()  //如果在node8版本,用此方法,会造成数据丢失

简单文件读取

fs.readFile(path[,path],callback):

  • path:读取文件的路径+文件名+后缀
  • options:配置对象(可选)
  • callback:回调
    • err:错误对象
    • data:读取出来的数据
//简单文件写入和简单文件读取,都是一次性把所有要读取或要写入的内容加到内存中,很容易造成内存泄漏

let fs = require('fs')
fs.readFile(__dirname+'/demo.txt',function(err,data){
    if(err){
        console.log('文件读取失败',err)
    }else{
        console.log('文件读取成功',data)
        fs.writeFile('./haha.txt',data,function(err){
            if(err){
                console.log('文件写入失败',err)
            }else{
                console.log('文件写入成功')
            }
        })
    }
})
/* 
为什么读取出来的东西是buffer?
用户存储的不一定是纯文本
*/

流式文件读取

fs.createWriteStream(path[,optoions]):

  • path:要读取的文件路径+文件名+后缀
  • options:
    • flags
    • encoding
    • fd
    • mode
    • autoClose
    • emitClose
    • start:起始偏移量
    • end:结束偏移量
    • highWaterMark:控制每次读取数据的大小,默认值:64kb
let {createReadStream} = require('fs')
//创建一个可读流
let rs = createReadStream(__dirname+'/demo.txt',{highWaterMark:10*1024*1024})
//监测流的状态
rs.on('open',function(){
    console.log('可读流打开了')
})
rs.on('close',function(){
    console.log('可读流关闭了')
})

//给可读流绑定一个data事件,就会触发可读流自动读取内容
rs.on('data',function(data){
    //buffer实例的length属性,是表示该buffer实例占用内存空间的大小
    console.log(data.length)  //输出的时65536,每次读取64kb内容
})

文章作者: Daniel Lin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Daniel Lin !
  目录