《Node.js 编程基础:编码注意事项、Buffer 使用与文件操作》

47 阅读6分钟

一、NodeJs编码注意事项

  • NodeJs中不能使用BomDomAPI,可以使用console和计时器API
  • Nodejs中的顶级对象为global,也可以用globalThis访问顶级对象

二、Buffer介绍与创建

1、定义:

Buffer中文译为【缓冲区】,是一个类似Array的对象,用于表示固定长度的字节序列,换句话,Buffer就是一段固定长度的内存空间,用于处理二进制数据

2、特点

  • Buffer大小固定且无法调整
  • Buffer性能较好,可以直接对计算机内存进行操作
  • 每个Buffer的单位元素是一个字节

3、创建方式

  • 使用alloc

这是安全的创建模式、会对旧的内存数据清0

let buf = Buffer.alloc(10) //101Byte
console.log(buf)

image.png

注意:上面默认是16进制

  • 使用allocUnsafe

这是不安全的创建方式,不会对原有的内存空间数据清0,这种方式会有旧数据,比第一种快,因为不用归0

let buf_1 = Buffer.allocUnsafe(10)
console.log(buf_1)

image.png

  • 使用from方法

可以将一个数组或者字符串转位Buffer

let buf_2 = Buffer.from('hello')
console.log(buf_2)

image.png

4、Buffer的操作与注意事项

  • buffer与字符串的转换 toString
let buf_3=Buffer.from([105,108,111,118,101,121,111,117])
console.log(buf_3.toString())

image.png

  • 元素的读
let buf_4 = Buffer.from('hello')
console.log(buf_4[0]) //默认16进制

image.png

查看2进制

console.log(buf_4[0].toString(2))

image.png

  • 元素的写
let buf_5 = Buffer.from('hello')
buf_5[0]=95;
console.log(buf_5.toString())

image.png

元素的读写都是通过[]

三、fs文件操作

文件写入

API

方法说明
writeFile异步写入
writeFileSync同步写入
appendFile/appendFileSync追加写入
createWriteStream流试写入

API详解

writeFile异步

语法fs.writeFile(file,data[,option],callback)

参数说明

  • file 文件名

  • data 待写入数据

  • options 选项设置(可选)

  • call 写入时回掉

返回值 undefined

代码示例

const fs = require('fs')

fs.writeFile("./test.txt","测试一下",error=>{
    //error 写入失败是一个错误对象,写入成功是:null
    if(error){
        console.log("失败")
        return;
    }
    console.log("写入成功")
})
writeFileSync同步写入

语法 fs.writeFileSync(file,data[,option])

参数说明

  • file 文件名

  • data 待写入数据

  • options 选项设置(可选)

  • call 写入时回掉

返回值 undefined

代码示例

const fs = require('fs')

fs.writeFileSync('./data.txt',"data")
appendFile/appendFileSync追加写入

appendFile/appendFileSync追加写入作用是在文件尾部追加内容,语法与writeFile/writeFileSync语法完全相同

语法fs.appendFile(file,data[,option],callback) / fs.appendFileSync(file,data[,option])

参数说明 与上面完全一样

返回值 undefined

代码演示

const fs = require('fs')

fs.writeFile("./test.txt","测试一下",error=>{
    //error 写入失败是一个错误对象,写入成功是:null
    if(error){
        console.log("失败")
        return;
    }
    console.log("写入成功")
})
fs.appendFile("./test.txt","测二下",error=>{
    //error 写入失败是一个错误对象,写入成功是:null
    if(error){
        console.log("失败")
        return;
    }
    console.log("写入成功")
})
createWriteStream 流试写入

语法fs.createWriteStream(path[,option])

参数说明

  • path 文件路径
  • options 选项配置(可选)

返回值 object

代码演示

const fs = require('fs')
const ws = fs.createWriteStream('./stream.text');
ws.write('1')
ws.write('2')
ws.close();

注意:程序打开一个文件是需要消耗资源的,流试写入可以减少打开关闭文件的次数,流试写入比较适用于大文件写入或者频繁写入的场景writeFile适用于写入频率低的场景

文件写入使用场景

  • 下载文件
  • 安装软件
  • 保存程序日志
  • 编辑器保存文件
  • 视频录制
  • 当需要持久化数据的时候应该想到文件写入

文件读取

API

方法说明
readFile异步读取
readFileSync同步读取
createReadStream流试读取

API详解

readFile

语法fs.readFile(path[,option],callback)

参数说明

  • path 文件路径
  • options 选项配置
  • callback 回调函数、、

返回值 undefined

代码演示

const fs = require('fs')
fs.readFile('./data.txt',(error,data)=>{
        if(error){
        console.log("失败")
        return;
    }
    console.log("写入成功")
    console.log(data.toString())
})
readFileSync

语法fs.readFileSync(path[,option])

参数说明

  • path 文件路径
  • options 选项配置

返回值 Buffer

代码演示

const fs = require('fs')
const data = fs.readFileSync('./data.txt').toString()
console.log(data)
createReadStream

语法fs.createReadStream(path[,option])

参数说明

  • path 文件路径
  • options 选项配置

返回值 objet

代码演示

const fs = require('fs')
const rs = fs.createReadStream('./data.txt')
rs.on('data',(chunk)=>{
    console.log(chunk)
})
rs.on('end',()=>{
    console.log("读取完成")
})

注意主要配合on触发事件使用

文件读取使用场景

  • 电脑开机
  • 程序运行
  • 编辑器打开文件
  • 查看图片
  • 播放视频
  • 播放音乐
  • git查看日志
  • 上传文件
  • 查看聊天记录

文件移动与命名

nodejs中,我们可以使用renamerenameSync来移动或重命名文件或者文件夹

语法fs.rename(oldPath,newPath,callback) fs.renameSync(oldPath,newPath)

参数说明

  • oldPath 文件当前路径
  • newPath 文件新路径
  • callback 操作后的回调

代码演示

const fs = require('fs')
fs.rename('./data.txt','./data_new.txt',(error)=>{
        if(error){
        console.log("失败")
        return;
    }
    console.log("成功")
})

文件删除

nodejs中,我们可以使用unlinkunlinkSync来移动或重命名文件或者文件夹

语法fs.unlink(path,callback) fs.unlink(path)

参数说明

  • path 文件路径
  • callback 操作后的回调

代码演示

const fs = require('fs')
fs.unlink('./data.txt',(error)=>{
        if(error){
        console.log("失败")
        return;
    }
    console.log("成功")
})

mkdir文件夹操作

API

方法说明
mkdir/mkdirSync创建文件夹
readdir/readdirSync读取文件夹
rmdir/rmdirSync删除文件夹

创建文件夹 mkdir/mkdirSync

在nodejs中使用mkdir或者mkdirSync创建文件夹

语法fs.mkdir(path[,option],callback) fs.mkdirSync(path[,option])

参数说明

  • path 文件路径
  • options 选项配置
  • callback 操作后回调

代码演示

const fs = require('fs')
fs.mkdir('./test',(error)=>{
        if(error){
        console.log("失败")
        return;
    }
    console.log("成功")
})
//递归创建
fs.mkdir('./test/html',{recursive:true},(error)=>{
    if(error){
    console.log("失败")
    return;
}
console.log("成功")
})

读取文件夹 readdir/readdirSync

语法fs.readdir(path[,option],callback) fs.readdirSync(path[,option])

参数说明

  • path 文件路径
  • options 选项配置
  • callback 操作后回调

代码演示

const fs = require('fs')
fs.readdir('./test',(error,data)=>{
        if(error){
        console.log("失败")
        return;
    }
    console.log("成功",data)
})

读取文件夹 rmdir/rmdirSync

语法fs.rmdir(path[,option],callback) fs.rmdirSync(path[,option])

参数说明

  • path 文件路径
  • options 选项配置
  • callback 操作后回调

代码演示

const fs = require('fs')
// 递归删除 -不建议
fs.rmdir('./test',{recursive:true},(error)=>{
        if(error){
        console.log("失败")
        return;
    }
    console.log("成功")
})

//建议使用 rm
fs.rm('./test',{recursive:true},(error)=>{
    if(error){
    console.log("失败")
    return;
}
console.log("成功")
})

查看资源状态

在nodejs中,我们可以使用stat或statSync来查看资源详细信息

语法fs.stat(path[,option],callback) fs.statSync(path[,option])

参数说明

  • path 文件路径
  • options 选项配置
  • callback 操作后回调

代码演示

const fs = require('fs')
fs.stat('./test.txt',(error,data)=>{
        if(error){
        console.log("失败")
        return;
    }
    console.log("成功",data)
})

路径

fs模块在对资源进行操作时,路径的写法有两种:

  • 相对路径:例如: ../、./
  • 绝对路径 例如: D:/Program/

__dirname 路径

__dirname 与require类型,都是Nodejs环境中全局变量

__dirname 保存着当前文件所在目录的绝对路径,可以使用__dirname与文件名拼接成绝对路径

在使用fs模块的时候,尽量使用__dirname将路径转化为绝对路径,这样可以避免相对路径产生的bug

__filename 路径

文件的绝对路径

path模块

API

方法说明
path.resolve拼接规范的绝对路径
path.sep获取操作系统的路径分隔符
path.parse解析路径并返回对象
path.basename获取路径的基础名称
path.dirname获取路径的目录名
path.extname获取路径的扩展名

代码示例

const path = require('path')

const url_1 = path.resolve(__dirname,'test.txt')
console.log(url_1)

//sep 分隔符、 windows /  linux \
console.log(path.sep)

console.log(path.basename(__dirname))

console.log(path.extname(path.resolve(__dirname,'fs.js')))