路漫漫其修远兮:js的成长经历(二十四)—— Node.js的fs文件系统

文件系统(File System)

Buffer(缓冲区)

什么是Buffer缓冲区

Node里面的buffer,是一个二进制数据容器,数据结构类似与数组,专门用于Node中数据的存放

Buffer的基本使用

  1. 历史使用
    const buf1 = new Buffer(10);
    安全隐患: 分配到的内存可能还存储着旧数据,这样就存在安全隐患
  2. 新使用方式
    Buffer.from(str) 将一个字符串转换为buffer
    Buffer.alloc(size) 创建一个指定大小的Buffer
    Buffer.alloUnsafe(size) 创建一个指定大小的Buffer,但是可能包含敏感数据
    Buffer.allocUnsafeSlow(size) 创建一个非内存池的 Buffer 实例并拷贝相关的比特位出来
  3. 使用示例
var buffer = new Buffer(10);
console.log(buffer); //<Buffer 00 00 00 00 00 00 00 00 00 00>


// 1. 字符串转成二进制
var str = "左眼会陪右眼哭";
var buffer = Buffer.from(str); //将一个字符串转换为buffer
console.log(buffer); //输出转为二进制之后的内容:<Buffer e5 b7 a6 e7 9c bc e4 bc 9a e9 99 aa e5 8f b3 e7 9c bc e5 93 ad>
console.log(buffer.length); //输出二进制转换后的长度:21
console.log(str.length); //输出字符串的长度:7
console.log(buffer.toString()); //将二进制转化为字符串:左眼会陪右眼哭


// 2. Buffer.alloc(size[, fill[, encoding]])
/*
  初始化: 确定的长度
*/
let buffer2 = Buffer.alloc(20); //创建一个指定大小的Buffer,Buffer的结构和数组很像
buffer2[0] = 10;
buffer2[1] = 12;
buffer2[2] = 0xfc;
buffer2[19] = 11;
buffer2[20] = 11;
// console.log(buffer2);
buffer2.forEach((item, index) => {
    console.log(index + ":" + item); //输出了二十个buffer对象
});

Buffer使用相关注意点

  • Buffer的结构和数组很像,操作的方法也和数组类似
  • Buffer中是以二进制的方式存储数据的
  • Buffer是Node自带,不需要引入,直接使用即可

fs文件系统

基本概念

  • 在Node中,与文件系统的交互是非常重要的,服务器的本质就将本地的文件发送给远程的客户端
  • Node通过fs模块来和文件系统进行交互,该模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互。
  • 要使用fs模块,首先要从核心模块中加载:
    const fs = require(“fs”);

使用特点

  • 要使用fs模块,首先要从核心模块中加载:
    const fs = require(“fs”);
  • fs模块中所有的操作都有两种形式可供选择同步和异步。
  • 同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码。
  • 异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回。

文件的基本操作

  1. 打开文件
    fs.open(path, flags[, mode], callback)
    fs.openSync(path, flags[, mode])
  • r 读取文件 , 文件不存在则出现异常
  • r+ 读写文件 , 文件不存在则出现异常
  • rs 在同步模式下打开文件用于读取
  • rs+ 在同步模式下打开文件用于读写
  • w 打开文件用于写操作 , 如果不存在则创建,如果存在则截断
  • wx 打开文件用于写操作 , 如果 存在则打开失败
  • w+ 打开文件用于读写 , 如果不存在则创建 , 如果存在则截断
  • wx+ 打开文件用于读写 , 如果 存在则打开失败
  • a 打开文件用于追加 , 如果不存在则创建
  • ax 打开文件用于追加 , 如果路径存在则失败
  • a+ 打开文件进行读取和追加 , 如果不存在则创建该文件
  • ax+ 打开文件进行读取和追加 , 如果路径存在则失败
  1. 关闭文件
    fs.close(fd, callback)
    fs.closeSync(fd)

fs中提供了四种不同的方式将数据写入文件

  1. 简单文件写入
    • fs.writeFile(file, data[, options], callback)
    • fs.writeFileSync(file, data[, options])
    参数:
    – file 文件路径
    – data 被写入的内容,可以是String或Buffer
    – options 对象,包含属性(encoding、mode、flag)
    – callback 回调函数

简单写入

// 1. 引入模块
let fs = require("fs");

// 2. 打开文件
let fd = fs.openSync("fs2.txt", "w");
// 2.2 写入文件
fs.writeFileSync(fd, "我是用Node.js用文件系统写进来的");
fs.closeSync(fd);

有回调写入

// 1. 引入模块
let fs = require("fs");

// 2. 打开文件
let fd = fs.openSync("fs1.txt", "w");
// 2.2 写入文件
fs.writeFile(fd, "我是用Node.js用文件系统写进来的", (err) => {
    // 2.2.1 写入成功
    if (!err) {
        console.log("写入文件成功");
    } else {
        throw err;
    }

}); 
  1. 同步文件写入
    • fs.writeSync(fd, buffer, offset, length[, position])
    • fs.writeSync(fd, data[, position[, encoding]])
    参数
    – fd 文件描述符,通过openSync()获取
    – data 要写入的数据(String 或 Buffer)
    – offset buffer写入的偏移量
    – length 写入的长度
    – position 写入的起始位置
    – encoding 写入编码
    注意: 要完成同步写入文件,先需要通过openSync()打开文件来获取一个文件描述符,然后在通过writeSync()写入文件。

// 1. 引入模块
let fs = require("fs");

// 2. 打开文件
let fd = fs.openSync("fs1.txt", "w");
// 2.1 判断是否出错

// 2.2 写入文件
fs.writeSync(fd, "花木兰:");
fs.writeSync(fd, "干嘛要这么想不开,要在在脸上贴个输字!");
//2.3 关闭文件
fs.closeSync(fd);

console.log("写入成功")
  1. 异步文件写入
    • fs.write(fd, buffer, offset, length[, position], callback)
    • fs.write(fd, data[, position[, encoding]], callback)
    参数:
    – fd 文件描述符
    – data 要写入的数据(String 或 Buffer)
    – offset buffer写入的偏移量
    – length 写入的长度
    – position 写入的起始位置
    – encoding 写入编码
    注意: 要使用异步写入文件,先需要通过open()打开文件,然后在回调函数中通过write()写入。
// 1. 引入模块
let fs = require("fs");

// 2. 打开文件
fs.open("fs.txt", "w", (err, fd) => {
    // 2.1 判断是否出错
    if (!err) {
        // 2.2 写入文件
        fs.writeFile(fd, "我是用Node.js用文件系统异步写进来的", (err) => {
            // 2.2.1 写入成功
            if (!err) {
                console.log("写入文件成功");
            } else {
                throw err;
            }

            // 2.3 关闭文件
            fs.close(fd, (err) => {
                if (!err) {
                    console.log("文件已经保存并关闭!");
                }
            });
        });
    } else {
        throw err;
    }
});
  1. 流式文件写入
// 1. 引入模块
let fs = require("fs");

// 2. 创建写入流
let ws = fs.createWriteStream("fs1.txt");
console.log(ws);

// 3. 打开通道
ws.once("open", () => {
    console.log("通道已经打开!");
});

ws.once("close", () => {
    console.log("通道已经关闭");
});

// 4. 写入内容
ws.write("我再马路边");
ws.write("捡到一毛钱");
ws.write("去买了一把刀");
ws.write("杀死一头牛");

// 5. 关闭通道
ws.end();

读取文件

1.二进制读取文件

let fs = require("fs");

// 2. 读取文件
fs.readFile("D:/PS/早安1.png", (err, data) => {
    // 2.1 判断
    if (!err) {
        // 2.2 写入图片文件
        fs.writeFile("zaoan.jpg", data, (err) => {
            if (!err) {
                console.log("写入成功")
            } else {
                throw err;
            }
        });
    } else {
        throw err;
    }
});

console.log("也可以用同样的方法读取视频文件")
  1. 流式文件读取
    流式文件读出:

    • 大文件
    • 多次把内容读入内存
    • 效率较高,安全

    注意:如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据

// 1. 引入模块
let fs = require("fs");

// 2. 创建读入流
let rs = fs.createReadStream("D:\\珍藏视频\\带你去旅行.mp4");
let ws = fs.createWriteStream("666.mp4");

// 3. 监听流的打开和关闭
ws.once("open", () => {
    console.log("读入通道已经打开!");
});

ws.once("close", () => {
    console.log("读入通道已经关闭");
});

rs.once("open", () => {
    console.log("写出通道已经打开!");
});

rs.once("close", () => {
    console.log("写出通道已经关闭");
});

/// 4. 绑定data
rs.on("data", (data) => {
    //  console.log(data);
    ws.write(data);
});
  1. 流式文件管道读取
// 1. 引入模块
let fs = require("fs");

// 2. 创建读入流
let rs = fs.createReadStream("D:\\珍藏视频\\带你去旅行.mp4");
let ws = fs.createWriteStream("777.mp4");

// 3. 创建管道
rs.pipe(ws);

在这里插入图片描述

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不愿意做鱼的小鲸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值