NODE.JS学习笔记(Buffer和fs)

39 阅读4分钟

node是什么?node可以看作是服务器端的JAVASCRIPT。除了对文件进行操作,NODE可以连接数据库,多线程等。

node.js不支持BOM和DOM的API,但可以使用console和定时器API,node.js的顶级对象为global,也可以用globalThis访问顶级对象。

Buffer缓冲区,是一段处理二进制数据的内存空间。

  • 创建Buffer的三种方法:
// alloc创建 会清空旧的内存空间
let buf = Buffer.alloc(10);
console.log(buf)

// allocUnsafe 可能包含旧的内存空间
let buf2 = Buffer.allocUnsafe(10);
console.log(buf2)

// from 字符串创建
let buf3 = Buffer.from("hello")
console.log(buf3)
//通过数组创建 Buffer
let buf_4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);
console.log(buf3)

buffer与字符串转换

let buf_4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);
console.log(buf_4.toString())

对buffer进行读写

//读取
console.log(buf_3[1]);
// 修 改 
buf_3[1] = 97;
//查看字符串结果
console.log(buf_3.toString());

注意:

  1. 如果修改的数值超过 255 ,则超过 8 位数据会被舍弃
  2. 一个utf-8 的字符 一般 占 3 个字节

fs模块

fs模块是node.js实现与硬盘的交互的模块,用于文件管理,实现写入、读取、追加内容等操作。

fs模块

fs模块是node.js实现与硬盘的交互的模块,用于文件管理,实现写入、读取、追加内容等操作。

文件写入

image.png

同步与异步的区别:

  1. 同步的执行顺序是: 从上到下的顺序,如果一个文件很大,那么他会等待这个文件执行完之后,在执行下面的代码
  2. 异步的执行顺序是: 执行一个很大的代码时 不会死等这个很大的代码执行完毕,会与其他小的文件一起执行

image.png

文件的异步写入 fs.writeFile(路径,内容,响应参数)

// 导入fs
const fs = require("fs");

// 写入文件

fs.writeFile("./book1.txt","鸡你太美", err => {
    // 写入失败,失败对象 ;写入成功,null
    if(err){
        console.log("写入失败");
        return
    }
    console.log("写入成功")
})

server.listen(9000, () =>{
    console.log("成功")
})

文件的同步写入 fs.writeFileSync(路径,内容,响应参数)

// 导入fs
const fs = require("fs");

// 写入文件
fs.appendFile('./座右铭.txt','择其善者而从之,其不善者而改之。',
    err => { if(err) throw err;
    console.log('追加成功')
});

server.listen(9000, () =>{
    console.log("成功")
})

文件的追加写入 appendFile / appendFileSync(路径,内容,响应参数):在文件尾部追加内容

// 导入fs
const fs = require("fs");

// 写入文件
fs.appendFile('./座右铭.txt','择其善者而从之,其不善者而改之。',
    err => { if(err) throw err;
    console.log('追加成功')
});

server.listen(9000, () =>{
    console.log("成功")
})

流式写入 createWriteStream用于高频、持续写入数据

const fs = require("fs");

const ws = fs.createWriteStream("./坤曲.txt");
ws.write("姬霓太美\r\n");
ws.write("姬霓太美\r\n");
ws.write("多看一眼就会爆炸\r\n");
ws.write("多靠近一点就会融化\r\n");

ws.close();

server.listen(9000, () =>{
    console.log("成功")
})

文件写入的应用场景:

  • 下载文件、安装软件、保存日志、编辑器保存文件、视频录制等
  • 实现数据的持久化保存需要考虑文件写入。

文件读取

异步读取:readFileSync

//导入 fs 模块
const fs = require('fs');
 
fs.readFile('./坤曲.txt', (err, data) => { if(err) throw err;
console.log(data);
});
 
fs.readFile('./坤曲.txt', 'utf-8',(err, data) => { if(err) throw err;
console.log(data);
});

同步读取:readFileSync

const fs = require("fs")

fs.readFileSync("./坤曲.txt",(err,data) => {
    if (err){
        console.log("读取失败");
        return;
    }
    console.log(data.toString());
})

流式读取:createReadSteam,一块块读取数据

//创建读取流对象
let rs = fs.createReadStream('./观书有感.txt');
//每次取出 64k 数据后执行一次 data 回调
rs.on('data', data => {
    console.log(data);
    console.log(data.length);
});
//读取完毕后, 执行 end 回调
rs.on('end', () => {
    console.log('读取完成')    
    })

复制项目1:

const fs = require("fs")

let data = fs.readFileSync("./资料/七里香.mp3")

fs.writeFileSync(
    "./七里香.mp3",data, err => {
    // 写入失败,失败对象 ;写入成功,null
    if(err){
        console.log("写入失败");
        return
    }
    console.log("写入成功")
})

复制项目2:流式读取

const fs = require("fs")
const rs = fs.createReadStream("./资料/七里香.mp3")
const ws = fs.createWriteStream("./资料/七里香1.mp3")
rs.on("data",chunk => {
    ws.write(chunk);
})

快捷写法:

const fs = require("fs")
const rs = fs.createReadStream("./资料/七里香.mp3")
const ws = fs.createWriteStream("./资料/七里香1.mp3")
rs.pipe(ws)

文件重命名和移动

const fs = require("fs")

fs.rename("./坤曲.txt","./只因你太美.txt",err => {
    if (err){
        console.log("读取失败");
        return
    }
     console.log("成功");
})

删除文件

const fs = require("fs")

fs.unlink("./资料/七里香1.mp3",err => {
    if (err){
        console.log("删除失败");
        return;
    }
     console.log("成功");
})
const fs = require("fs")

fs.rm("./资料/七里香1.mp3",err => {
    if (err){
        console.log("删除失败");
        return;
    }
     console.log("成功");
})

文件夹操作

创建文件夹

异步方法:mkdir 同步方法:mkdirSync

const fs = require("fs")

fs.mkdir("./html",err => {
    if (err){
        console.log("失败");
        return
    }
     console.log("成功");
})

递归 创建:设置参数{recursive:true}

const fs = require("fs")

fs.mkdir("./a/b/c",{recursive:true},err => {
    if (err){
        console.log("失败");
        return
    }
     console.log("成功");
})

读取文件夹

const fs = require("fs")

fs.readdir("./a",{recursive:true},err => {
    if (err){
        console.log("失败");
        return
    }
     console.log("成功");
})

查看资源状态:

const fs = require("fs")

fs.stat("./资料/七里香.mp3",(err,data) => {
    if (err){
        console.log("删除失败");
        return;
    }
    console.log(data);
    console.log(data.isFile()); 
    console.log(data.isDirectory());
})
  • __ dirname : 对象所在绝对路径

拆分:split(".")

const fs = require("fs")
const files = fs.readdirSync("./html/code")
// console.log(files)

files.forEach(
    item => {
        let data = item.split(".")
        console.log(data)
    }
)

案例

实现文件复制功能:

先用fs方法访问目标文件夹,forEach循环方法,读取文件。

const fs = require("fs")
const files = fs.readdirSync("./html/code")

files.forEach(item => {
    let data = item.split(".")
    let [num,name] = data
    if (Number(num) < 10){
        num = "0" + num
    }
    let newname = num + "." + name + ".js"
    // console.log(newname)
    fs.renameSync(`./html/code/${item}`,`./html/code/${newname}` )
})