Node.js |(二)Node.js API:fs模块 | 尚硅谷2023版Node.js零基础视频教程

学习视频:尚硅谷2023版Node.js零基础视频教程,nodejs新手到高手

在这里插入图片描述

文章目录

  • 📚文件写入
    • 🐇writeFile 异步写入
    • 🐇writeFileSync 同步写入
    • 🐇appendFile / appendFileSync 追加写入
    • 🐇createWriteStream 流式写入
    • 🐇写入文件的场景
  • 📚文件读取
    • 🐇 readFile 异步读取
    • 🐇readFileSync 同步读取
    • 🐇createReadStream 流式读取
    • 🐇fs文件练习——文件复制
  • 📚文件移动与重命名
  • 📚文件删除
  • 📚文件夹操作
    • 🐇mkdir 创建文件夹
    • 🐇readdir 读取文件夹
    • 🐇rmdir 删除文件夹
    • 🐇fs文件练习——批量重命名
  • 📚查看资源状态
  • 📚相对路径问题
  • 📚_dirname全局变量

在这里插入图片描述

  • fsfile system,文件系统。
  • fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动、内容的写入读取以及文件夹的相关操作。

📚文件写入

🐇writeFile 异步写入

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

  • 参数说明

    • file文件名
    • data 待写入的数据
    • options选项设置(可选)
    • callback写入回调
  • 返回值undefined

    /*** 需求:* 新建一个文件, 座右铭.txt, 写入内容, 三人行, 则必有我师焉*///1. 导入 fs 模块
    const fs = require('fs');//2. 写入文件
    fs.writeFile('./座右铭.txt', '三人行, 则必有我师焉', err => 
    {// err(回调函数)写入失败: 错误对象  写入成功: nullif(err){console.log('写入失败');return;}console.log('写入成功');
    });
    

    在这里插入图片描述


  • 异步:如下,1+1在最后,但它压根不带等上边的,它俩一块运行,谁也不妨碍谁,1+1先跑完就先输出。

    /*** 需求:* 新建一个文件, 座右铭.txt, 写入内容, 三人行, 则必有我师焉*///1. 导入 fs 模块
    const fs = require('fs');//2. 写入文件
    fs.writeFile('./座右铭.txt', '三人行, 则必有我师焉', err => 
    {// err(回调函数)写入失败: 错误对象  写入成功: nullif(err){console.log('写入失败');return;}console.log('写入成功');
    });console.log(1 + 1);
    

    在这里插入图片描述

🐇writeFileSync 同步写入

  • 语法: fs.writeFileSync(file, data[, options])

  • 参数与 fs.writeFile 大体一致,只是没有 callback 参数。

  • 返回值undefined

    //1. 导入 fs 模块
    const fs = require('fs');//2. 写入文件
    //同步写入
    fs.writeFileSync('./data.txt', 'test');
    console.log(1 + 1);
    
  • 同步:就是一条道,我走完你再走,从上到下顺序执行。

    /*** 需求:* 新建一个文件, 座右铭.txt, 写入内容, 三人行, 则必有我师焉*///1. 导入 fs 模块
    const fs = require('fs');//2. 写入文件
    //同步写入
    try{fs.writeFileSync('./座右铭.txt', '三人行,必有我师焉。');console.log('OK');
    }
    catch(e){console.log(e);
    }
    console.log(1 + 1);
    

    在这里插入图片描述


Node.js 中的磁盘操作是由其他线程完成的,结果的处理有两种模式:

  • 同步处理:JavaScript主线程会等待其他线程的执行结果,然后再继续执行主线程的代码,效率较低
  • 异步处理:JavaScript主线程不会等待其他线程的执行结果,直接执行后续的主线程代码,效率较好

🐇appendFile / appendFileSync 追加写入

  • appendFile 作用是在文件尾部追加内容,appendFile 语法与 writeFile 语法完全相同。

  • 语法:

    • fs.appendFile(file, data[, options], callback)
    • fs.appendFileSync(file, data[, options])
  • 返回值: 二者都为 undefined

    //1. 引入 fs 模块
    const fs = require('fs');//2. 调用 appendFile
    fs.appendFile('./座右铭.txt', ',择其善者而从之, 择期不善者而改之', err => {//判断if(err){console.log('写入失败~~');return;}console.log('追加写入成功');
    });fs.appendFileSync('./座右铭.txt', '\r\n温故而知新, 可以为师矣')//writeFile 实现追加写入
    fs.writeFile('./座右铭.txt', 'love love love',{flag: 'a'}, err => {if(err) {console.log('写入失败~');return ;}console.log('写入成功');
    });
    

    在这里插入图片描述

🐇createWriteStream 流式写入

  • 语法fs.createWriteStream(path[, options])
  • 参数说明
    • path:文件路径
    • options:选项配置( 可选 )
  • 返回值Object
    //1. 导入 fs 
    const fs = require('fs');//2. 创建写入流对象 
    const ws = fs.createWriteStream('./观书有感.txt');//3. write
    ws.write('半亩方塘一鉴开\r\n');
    ws.write('天光云影共徘徊\r\n');
    ws.write('问渠那得清如许\r\n');
    ws.write('为有源头活水来\r\n');//4. 关闭通道
    ws.close();
    
    在这里插入图片描述

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

🐇写入文件的场景

在这里插入图片描述

📚文件读取

在这里插入图片描述

🐇 readFile 异步读取

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

  • 参数说明

    • path:文件路径
    • options:选项配置
    • callback:回调函数
  • 返回值undefined

    //1. 引入 fs 模块
    const fs = require('fs');//2. 异步读取
    fs.readFile('./观书有感.txt', (err, data) => {if(err) {console.log('读取失败~~');return;}console.log(data.toString());
    });
    

🐇readFileSync 同步读取

  • 语法fs.readFileSync(path[, options])

  • 参数说明

    • path:文件路径
    • options:选项配置
  • 返回值string | Buffer

    //1. 引入 fs 模块
    const fs = require('fs');
    //2. 同步读取
    let data = fs.readFileSync('./观书有感.txt');
    console.log(data.toString());
    

🐇createReadStream 流式读取

  • 语法fs.createReadStream(path[, options])

  • 参数说明

    • path:文件路径
    • options:选项配置( 可选 )
  • 返回值Object

    //1. 引入 fs 模块
    const fs = require('fs');//2. 创建读取流对象
    const rs = fs.createReadStream('../资料/笑看风云.mp4');//3. 绑定 data 事件   chunk 块儿  大块儿
    rs.on('data', chunk => {console.log(chunk.length); // 65536 字节 => 64KB,每次读取64KB的数据
    });//4. end  可选事件
    rs.on('end', () => {console.log('读取完成');
    });
    

    在这里插入图片描述


  • 读取文件应用场景
    在这里插入图片描述

🐇fs文件练习——文件复制

/*** 需求:*   复制『资料』文件夹下的『笑看风云.mp4』*/
const fs = require('fs');//方式一 readFile
//读取文件内容
let data = fs.readFileSync('../资料/笑看风云.mp4');
//写入文件
fs.writeFileSync('../资料/笑看风云-2.mp4', data);//方式二 流式操作
//创建读取流对象
const rs = fs.createReadStream('../资料/笑看风云.mp4');
//创建写入流对象
const ws = fs.createWriteStream('../资料/笑看风云-3.mp4');//绑定 data 事件
rs.on('data', chunk => {ws.write(chunk);
});

在这里插入图片描述


查看内存占用量

const fs = require('fs');
const process = require('process');//方式一 readFile
let data = fs.readFileSync('../资料/笑看风云.mp4');
fs.writeFileSync('../资料/笑看风云-2.mp4', data);
console.log("我是readfile的结果");
console.log(process.memoryUsage()); //方式二 流式操作
const rs = fs.createReadStream('../资料/笑看风云.mp4');
const ws = fs.createWriteStream('../资料/笑看风云-3.mp4');//绑定 data 事件(2.1)
rs.on('data', chunk => {ws.write(chunk);
});rs.on('end', () => {console.log("我是流式读取的结果");console.log(process.memoryUsage());  
})//(2.2),借助管道完成读取
// rs.pipe(ws);

在这里插入图片描述

  • 视频里头流式处理可厉害了,我这咋流式处理菜菜的?
  • 流式处理所占用的内存比直接读取更大是因为流式处理需要在处理数据时逐行或逐块读取数据,并将其存储在内存中以进行后续处理。这意味着在读取数据时,需要维护一个缓冲区来存储数据,因此在处理大量数据时,内存的使用率可能比直接读取更高。
  • 另外,流式处理还需要在处理后及时释放内存,否则可能会导致内存泄漏和程序崩溃等问题。因此,在设计流式处理程序时需要特别注意内存的使用和释放问题,以确保程序的稳定性和可靠性。

📚文件移动与重命名

  • 在 Node.js 中,我们可以使用 renamerenameSync 来移动或重命名 文件或文件夹
  • 语法
    • fs.rename(oldPath, newPath, callback)
    • fs.renameSync(oldPath, newPath)
  • 参数说明
    • oldPath:文件当前的路径
    • newPath:文件新的路径
    • callback:操作后的回调
    //1. 导入 fs 模块
    const fs = require('fs');//2. 调用 rename 方法
    fs.rename('./座右铭.txt', './论语.txt', err => {if(err) {console.log('操作失败~');return;}console.log('操作成功');
    });//文件的移动
    fs.rename('./data.txt', '../资料/data.txt', err => {if(err) {console.log('操作失败~');return;}console.log('操作成功');
    })
    

📚文件删除

  • 在 Node.js 中,我们可以使用unlinkunlinkSyncrmrmSync来删除文件。
  • 语法
    • fs.unlink(path, callback)
    • fs.unlinkSync(path)
    • fs.rm(path, callback)
    • fs.rmSync(path)
  • 参数说明
    • path:文件路径
    • callback:操作后的回调
    //1. 导入 fs 模块
    const fs = require('fs');//2. (一)调用 unlink 方法    unlinkSync
    fs.unlink('./观书有感.txt', err => {if(err) {console.log('删除失败~');return;}console.log('删除成功');
    });// 2. (二)调用 rm 方法   rmSync
    fs.rm('./论语.txt', err => {if (err) {console.log('删除失败~');return;}console.log('删除成功');
    })
    

📚文件夹操作

在这里插入图片描述

补充笔记:常用的 Linux 操作

🐇mkdir 创建文件夹

  • 在 Node.js 中,我们可以使用 mkdirmkdirSync来创建文件夹
  • 语法
    • fs.mkdir(path[, options], callback)
    • fs.mkdirSync(path[, options])
  • 参数说明
    • path:文件夹路径
    • options:选项配置( 可选 )
    • callback:操作后的回调

🐇readdir 读取文件夹

  • 在 Node.js 中,我们可以使用 readdirreaddirSyn 来创建文件夹
  • 语法
    • fs.readdir(path[, options], callback)
    • fs.readdirSync(path[, options])
  • 参数说明
    • path:文件夹路径
    • options:选项配置( 可选 )
    • callback:操作后的回调

🐇rmdir 删除文件夹

  • 在 Node.js 中,我们可以使用 rmdirrmdirSync来创建文件夹
  • 语法
    • fs.rmdir(path[, options], callback)
    • fs.rmdirSync(path[, options])
  • 参数说明
    • path:文件夹路径
    • options:选项配置( 可选 )
    • callback:操作后的回调

//1. 导入 fs 模块
const fs = require('fs');//2. 创建文件夹  mk  make 制作  dir directory 文件夹
fs.mkdir('./html', err => {if(err) {console.log('创建失败~');return;}console.log('创建成功');
});//2-2 递归创建
fs.mkdir('./a/b/c', {recursive: true},err => {if(err) {console.log('创建失败~');return;}console.log('创建成功');
});//2-3 读取文件夹   read 读取  dir  directory 文件夹
fs.readdir('../资料', (err, data) => {if(err){console.log('读取失败');return;}console.log(data);
});fs.readdir('./', (err, data) => {if(err){console.log('读取失败');return;}console.log(data);
});//2-4 删除文件夹  rm  remove 移除
fs.rmdir('./html', err => {if(err){console.log('删除失败');return;}console.log('删除成功');
});//递归删除    不推荐使用
// fs.rmdir('./a', {recursive: true},err => {
//   if(err){
//     console.log(err);
//     return;
//   }
//   console.log('删除成功');
// });//建议使用
fs.rm('./a', {recursive: true},err => {if(err){console.log(err);return;}console.log('删除成功');
});

🐇fs文件练习——批量重命名

  • 需求:批量重命名,把1、2等变为01、02等,可应用于防止网盘文件错位。

    //导入 fs 模块
    const fs = require('fs');//读取 code 文件夹
    const files = fs.readdirSync('./code');//遍历数组
    files.forEach(item => {//拆分文件名let data = item.split('-');let [num, name] = data;//num存数字,name存文件名//判断if(Number(num) < 10){num = '0' + num;}//创建新的文件名let newName = num + '-' + name;//重命名fs.renameSync(`./code/${item}`, `./code/${newName}`);
    })
    
  • 需求:批量重命名并排好序,比如1、3、4变为01、02、03。

    //导入 fs 模块
    const fs = require('fs');//读取 code 文件夹
    const files = fs.readdirSync('./code');//遍历数组
    files.forEach((item, index) => {//拆分let [num, name] = item.split('-');//index 自增index++;//判断index = index < 10 ? '0' + index : index;//拼接新的名字let newName = index + '-' + name;//移动文件fs.renameSync(`./code/${item}`, `./code/${newName}`);
    });
    

📚查看资源状态

  • 在 Node.js 中,我们可以使用 statstatSync来创建文件夹

  • 语法

    • fs.stat(path[, options], callback)
    • fs.statSync(path[, options])
  • 参数说明

    • path:文件夹路径
    • options:选项配置( 可选 )
    • callback:操作后的回调
    //1. 导入 fs 模块
    const fs = require('fs');//2. stat 方法  status 缩写 状态
    fs.stat('../资料/笑看风云.mp4', (err, data) => {if(err){console.log('操作失败');return;}console.log(data);console.log(data.isFile());console.log(data.isDirectory());
    });
    

    在这里插入图片描述

    • size 文件体积
    • birthtime 创建时间
    • mtime 最后修改时间
    • isFile 检测是否为文件
    • isDirectory 检测是否为文件夹

📚相对路径问题

学习html图片标签时对相对路径问题有过介绍

在这里插入图片描述

📚_dirname全局变量

  • __dirnamerequire类似,都是 Node.js 环境中的全局变量
  • __dirname保存着当前文件所在目录的绝对路径 ,可以使用 __dirname与文件名拼接成绝对路径
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/86173.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud实用篇6——elasticsearch搜索功能

目录 1 DSL查询文档1.1 DSL查询分类1.2 全文检索查询1.2.1 使用场景1.2.2 基本语法1.2.3 示例1.2.4 总结 1.3 精准查询1.3.1 term查询1.3.2 range查询1.3.3 总结 1.4.地理坐标查询1.4.1 矩形范围查询1.4.2 附近查询 1.5 复合查询1.5.1 相关性算分1.5.2 算分函数查询1&#xff0…

Prometheus入门

Prometheus(普罗米修斯) 是一种 新型监控告警工具,Kubernetes 的流行带动了 Prometheus 的应用。 全文参考自 prometheus 学习笔记(1)-mac 单机版环境搭建[1] Mac 上安装 Prometheus brew install prometheus 安装路径在 /usr/local/Cellar/prometheus/2.20.1, 配置文件在 /usr…

08-1_Qt 5.9 C++开发指南_QPainter绘图

文章目录 前言1. QPainter 绘图系统1.1 QPainter 与QPaintDevice1.2 paintEvent事件和绘图区1.3 QPainter 绘图的主要属性 2. QPen的主要功能3. QBrush的主要功能4. 渐变填充5. QPainter 绘制基本图形元件5.1 基本图像元件5.2 QpainterPath的使用 前言 本章所介绍内容基本在《…

聚观早报 | 三星和LG发展电车零件业务;宝马召回国产和进口电车

【聚观365】8月12日消息 三星和LG加速发展电车零件业务宝马召回部分国产和进口电动汽车华为有意推动车BU独立运营长城汽车CTO就“中国汽车在一起”发声比科奇芯片被Contela选为单元的核心组件 三星和LG加速发展电车零件业务 随着电动汽车需求的增加&#xff0c;对电池、芯片等…

新一代分布式融合存储,数据场景All In One

1、摘要 2023年5月11日&#xff0c;浪潮信息全国巡展广州站正式启航。会上&#xff0c;重磅发布新一代分布式融合存储AS13000G7&#xff0c;其采用极致融合架构设计理念&#xff0c;实现同一套存储满足四种非结构化数据的“All In One”高效融合&#xff0c;数据存力提升300%&a…

28.Netty源码之缓存一致性协议

Mpsc Queue 基础知识 Mpsc 的全称是 Multi Producer Single Consumer&#xff0c;多生产者单消费者。Mpsc Queue 可以保证多个生产者同时访问队列是线程安全的&#xff0c;而且同一时刻只允许一个消费者从队列中读取数据。 Netty Reactor 线程中任务队列 taskQueue 必须满足多个…

pycharm离线安装依赖包

一、对于单个下载离线包&#xff0c;然后安装 1、先去https://pypi.org/网站下载离线包&#xff0c;下载到本地&#xff1b; 2、从磁盘中找到刚刚下载包&#xff0c;点击确定就可以安装了 二、将本地项目所有依赖包全部下载下来&#xff0c;然后批量在另一个项目&#xff…

造个破谣而已,咋还用上AI了?

最近&#xff0c;央视等各大媒体纷纷曝光了全国多起用AI炮制网络谣言的案例&#xff0c;其中涉及灾害、安全事故、刑事案件等多类谣言内容&#xff0c;造谣的方式更是从文案到图片、视频不一而足。 看到这样的消息&#xff0c;总是会加重我们对AI的担忧&#xff0c;联想到此前的…

windows使用/服务(13)戴尔电脑怎么设置通电自动开机

戴尔pc机器通电自启动 1、将主机显示器键盘鼠标连接好后&#xff0c;按主机电源键开机 2、在开机过程中按键盘"F12",进入如下界面&#xff0c;选择“BIOS SETUP” 3、选择“Power Management” 4、选择“AC Recovery”&#xff0c;点选“Power On”&#xff0c;点击“…

C语言每日一题:16:数对。

思路一&#xff1a;基本思路 1.x,y均不大于n&#xff0c;就是小于等于n。 2.x%y大于等于k。 3.一般的思路使用双for循环去遍历每一对数。 代码实现&#xff1a; #include <stdio.h> int main() {int n 0;int k 0;//输入scanf("%d%d", &n, &k);int x…

springboot第35集:微服务与flutter安卓App开发

Google Playplay.google.com/apps/publis…[1]应用宝open.qq.com/[2]百度手机助手app.baidu.com/[3]360 手机助手dev.360.cn/[4]vivo 应用商店dev.vivo.com.cn/[5]OPPO 软件商店&#xff08;一加&#xff09;open.oppomobile.com/[6]小米应用商店dev.mi.com/[7]华为应用市场dev…

Pycharm解决启动时候索引慢的问题

设置里去掉update里面的两个勾 shared indexes中&#xff0c;把自动下载索引改成不下载使用本地索引

综合能源系统(6)——综合能源综合评估技术

综合能源系统关键技术与典型案例  何泽家&#xff0c;李德智主编 综合能源系统是多种能源系统非线性耦合的、多时间与空间尺度耦合的“源-网-荷一储”一体化系统&#xff0c;通过能源耦合、多能互补&#xff0c;能够实现能源的高效利用&#xff0c;并提高新能源的利用水平。对…

沁恒ch32V208处理器开发(三)GPIO控制

目录 GPIO功能概述 CH32V2x 微控制器的GPIO 口可以配置成多种输入或输出模式&#xff0c;内置可关闭的上拉或下拉电阻&#xff0c;可以配置成推挽或开漏功能。GPIO 口还可以复用成其他功能。端口的每个引脚都可以配置成以下的多种模式之一&#xff1a; 1 浮空输入 2 上拉输入…

安装使用IDEA,修改样式,配置服务,构建Maven项目(超级详细版)

目录 前言&#xff1a; 一&#xff0c;安装 1.1打开官网JetBrains: Essential tools for software developers and teams点击 Developer Tools&#xff0c;再点击 Intellij IDEA 2.点击下载​编辑 3.选择对应的版本&#xff0c;左边的 Ultimate 版本为旗舰版&#xff0c;需要…

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用

qModMaster工具介绍 QModMaster是一个基于Qt的Modbus主站&#xff08;Master&#xff09;模拟器&#xff0c;用于模拟和测试Modbus TCP和RTU通信。它提供了一个直观的图形界面&#xff0c;使用户能够轻松设置和发送Modbus请求&#xff0c;并查看和分析响应数据。 以下是QModM…

图像处理技巧形态学滤波之腐蚀操作

1. 引言 欢迎回来&#xff0c;我的图像处理爱好者们&#xff01;今天&#xff0c;让我们深入研究图像处理领域中的形态学计算。这些非线性的图像处理技术允许我们操纵图像中对象的形状和结构。在本系列中&#xff0c;我们将依次介绍四种基本的形态学操作&#xff1a;腐蚀、膨胀…

Kafka 概述

Kafka 为什么需要消息队列&#xff08;MQ&#xff09;使用消息队列的好处&#xff08;1&#xff09;解耦&#xff08;2&#xff09;可恢复性&#xff08;3&#xff09;缓冲&#xff08;4&#xff09;灵活性 & 峰值处理能力&#xff08;5&#xff09;异步通信 消息队列的两…

Neo4j笔记-数据迁移(导出/导入)

这里先说明以下几点&#xff1a; Neo4j在4.0下版本默认的库名是&#xff1a;graph.db Neo4j在4.0上版本默认的库名是&#xff1a;neo4j.db 不管是Neo4j&#xff0c;还是Neo4j Desktop&#xff0c;都会在bin目录下有neo4j、neo4j-admin软件。在conf目录下&#xff0c;有neo4j.…

MySQL SUBSTRING_INDEX() 函数的详细介绍

MySQL SUBSTRING_INDEX() 从给定字符串中返回指定数量的分隔符出现之前的子字符串。 当指定数字为正数时从最终分隔符的左侧返回子字符串&#xff0c;当指定数字为负数时从最终分隔符的右侧返回子字符串。 如果指定的次数大于分隔符的出现次数&#xff0c;则返回的子字符串将…