Buffer缓冲器
Buffer是什么
Buffer是一个和数组类似的对象,不同是Buffer是专门用来保存二进制数据的。
Buffer特点
它是一个类似于数组的对象,用于存储数据(存储的是二进制数据)
Buffer的效率很高,存储和读取很快,它是直接对计算机的内存进行操作
每个元素大小为1字节(byte)
Buffer大小一旦确定了,不可修改
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 writeFilecallback:回调函数
- 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:写入文件的起始位置(偏移量)
- flags:打开文件要执行的操作, 默认值:
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内容
})