版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Node.js文件系统编程与流处理CONTENTS目录01文件系统基础02文件操作03流处理04文件进阶操作fs模块fs模块是Node.js中用于操作文件系统的核心模块,就像在计算机上使用文件管理器一样,它能实现文件的读写、创建、删除等操作。fs模块提供了同步和异步两种形式的API。1.异步API异步API执行时通过回调函数、Promise(如mises)或async/await获取操作结果,适用于高并发场景,不会阻塞主线程。实际开发中,为避免阻塞程序,异步API更为常用。基本用法:fs.readFile('file.txt','utf8',(err,data)=>{/*处理数据*/})示例代码:constfs=require('fs');fs.readFile('file.txt','utf8',(err,data)=>{if(err)throwerr;console.log(data);});1.文件系统基础Node.js的fs模块优先使用异步API,慎用同步API。使用path模块进行路径处理,避免手动拼接。根据需求选择文件模式(r/w/a),确保数据安全。对于并发问题,可以通过独占标志wx或第三方库实现文件锁机制。1.文件系统基础2.同步API同步API执行时会阻塞主线程,直到操作完成,适用于处理脚本或简单任务。其方法名以Sync结尾(如readFileSync)。基本用法:fs.readFileSync('file.txt','utf8')示例代码:constfs=require('fs');constdata=fs.readFileSync('file.txt','utf8');console.log(data);fs模块优先使用异步API,同步API仅适用于简单场景(如初始化配置)。
文件路径处理
01路径类型(1)绝对路径:从系统根文件夹开始的路径,例如/home/user/file.txt(Linux
操作系统)或C:\user\file.txt(Windows操作系统)。(2)相对路径:基于当前工作文件夹(通过process.cwd()获取)而言的路径。./表示当前文件夹,../表示上一级文件夹,例如./data/file.txt表示当前文件夹下子文件夹data中的文件file.txt,../config.json表示上一级文件夹的文件config.json。02路径处理使用Node.js的path模块解决跨平台不兼容问题和路径拼接问题。基本用法:constfullPath=path.join(__dirname,'subdir','file.txt');//安全拼接路径constabsolutePath=path.resolve('file.txt');//转换为绝对路径代码中的__dirname表示当前文件所在文件夹的绝对路径。文件路径处理时应避免手动拼接路径,例如'dir/'+'file.txt',易出错且不支持跨平台。1.文件系统基础1.文件系统基础文件模式用来控制对文件的访问权限,常见的权限标志有r、w、a。r权限就像只能翻开阅读一本书里面的内容;w权限类似可以在书上随意写写画画,修改内容;a权限则是在书的末尾添加新内容,而不会覆盖原来的内容。权限标志用于定义文件操作权限和模式,常用的权限标志如下。①r:只读(read,读权限),要求文件必须存在。②w:写入(write,写权限),如果文件不存在,则创建一个新文件;如果文件存在,则会清空已有内容。③a:追加(append,追加权限),创建文件或在末尾写入,适用于日志类场景。④r+:读写,要求文件必须存在。⑤wx:独占模式写入,用于避免并发写入冲突(类似文件锁),若文件已存在则失败。文件模式1.文件系统基础在编程中,当使用fs.open()函数打开文件时,可以传入这些权限标志。基本用法:fs.open('file.txt','w',(err,fd)=>{/*操作文件*/})表示以写入模式打开文件,如果文件不存在则创建文件,文件存在则覆盖原有内容。fs.open('file.txt','a',(err,fd)=>{//操作文件});表示向文件末尾追加内容,不会覆盖原有内容。文件模式1.文件系统基础1.文件描述符文件描述符(fd)是操作系统为打开的文件分配的一个数字标识符,类似于图书馆给每本书分配的编号,通过这个编号,程序能快速定位和操作文件。当使用fs.open()打开文件成功后,会得到一个fd,后续的读写操作,如fs.read()、fs.write()和fs.close(),都需要用到fd。2.文件锁文件锁可以避免多个程序或线程同时读写文件导致的数据混乱,就像在使用共享文档时,先给文档加个密码锁,防止别人同时修改文档。原生Node.js不支持系统级文件锁,但可通过以下方式模拟实现文件锁功能。(1)独占标志wx,创建临时锁文件标记占用状态,写入时若文件存在则失败。(2)第三方库(如fs-ext的flock()),用于在多进程/多服务并发写入同一文件时避免冲突,确保文件操作的安全性和一致性。文件描述符与文件锁2.文件操作在Node.js中,fs.open()用于打开文件,使用时需要传入文件名、打开模式等参数,成功执行后会返回fd,这个描述符就像打开文件后拿到的“钥匙”,后续读写操作均依赖其进行。而fs.close()则用于在文件使用完毕后关闭文件,释放系统资源,就像离开房间后要关门一样,防止数据丢失或被误操作,使用时传入fd即可完成关闭操作。fs.open()和fs.close()通过fd精细化控制文件读写过程。基本用法:fs.open(path,flags,callback)其中path表示待打开文件的路径,flags表示文件操作模式(如r为只读、w为写入),callback表示回调函数返回的结果。打开/关闭文件
2.文件操作fs.stat()用于获取文件或文件夹的详细信息,如同查看商品标签获取商品详情。执行fs.stat()并传入文件名,它会返回一个包含文件大小、创建时间、修改时间、权限等信息的对象。异步调用fs.stat()的基本用法如验证示例4-1所示。【验证示例4-1】在文件夹Unit04中创建文件demo0401.js,在该文件中输入以下代码:constfs=require('fs');fs.stat('file.txt',(err,stats)=>{console.log(stats.size);//文件大小(单位为字节)console.log(stats.isFile());//是否为文件console.log(stats.mtime);//修改时间});运行文件demo0401.js的代码,即可输出文本文件file.txt的相关信息。文件不存在时返回ENOENT错误,需用try/catch或回调处理。同步版本的基本用法为fs.statSync()。通过stats.isDirectory()可判断目标是否为文件夹。获取文件或文件夹信息2.文件操作fs.readFile()是从文件中读取内容的方法,就像翻开书本阅读文字。使用时传入文件名和编码格式(如utf8),如果是异步操作,还需传入回调函数处理读取结果。当文件读取成功,回调函数会得到文件内容;若读取失败,则会收到错误信息。在开发中fs.readFile()常用于读取配置文件、文本数据等。fs.readFile()适用于一次性读取整个文件内容,适合处理小文件。未指定编码(如'utf8')时返回Buffer对象。同步版本的基本用法为fs.readFileSync()。前面说过fs.readFile()适合读取小文件,若要读取大文件,推荐使用fs.createReadStream(),其流式读取方式,可避免内存溢出。读取文件2.文件操作【操作要求】在文件夹Unit04中,使用VSCode创建JavaScript文件case0401.js,在该文件中编写代码实现以下功能。(1)分别使用同步API和异步API读取文本文件input.txt的内容“Node.js”,并且在终端输出所读取的内容。(2)使用异步API向文本文件output.txt写入“HelloNode.js”,如果成功写入文件,则在终端输出“文件写入成功”。【训练实例4-1】文件读写操作2.文件操作【实现过程】在文件夹Unit04中创建JavaScript文件case0401.js,在该文件中输入以下代码:【训练实例4-1】文件读写操作2.文件操作文件夹操作主要包括创建文件夹、删除文件夹、遍历文件夹。(1)创建文件夹。fs.mkdir()用于创建文件夹,类似于在计算机上新建文件夹,需传入文件夹名称和回调函数,成功创建后回调函数无错误参数,失败则返回错误。(2)删除文件夹。fs.rmdir()用于删除空文件夹,若文件夹非空则会报错,类似于清空房间后才能拆除房子。(3)遍历文件夹。借助fs.readdir()读取文件夹内的文件和子文件夹列表,再结合递归等方式,可以实现对整个文件夹及其子文件夹内容的遍历,以便查找、处理文件夹下的所有文件。文件夹操作【操作要求】在文件夹Unit04中,使用VSCode创建JavaScript文件case0402.js,在该程序文件中综合应用命令行参数解析(process.argv[
])、文件系统异步遍历文件夹操作(fs.readdir())和同步重命名操作(fs.renameSync())、路径处理(path.extname()、path.join())编写代码实现文件批量重命名,即将文件夹img中的图片文件重命名为以“image_”开头,后接从1开始的数字序号,扩展名不改变。2.文件操作【训练实例4-2】文件批量重命名【实现过程】在文件夹Unit04中创建JavaScript文件case0402.js,在该文件中输入以下代码:2.文件操作【训练实例4-2】文件批量重命名在Node.js中,fs.chmod()和fs.chown()用于文件权限管理,在系统管理、多用户协作等场景中非常重要。(1)fs.chmod():用于修改文件权限(类UNIX系统)。这就像调整门锁的权限,决定哪些人能进入房间(读取文件)、修改内容(写入文件)等。传入文件名和权限模式即可修改文件权限,如权限码0o755表示所有者可读可写可执行,其他用户可读可执行。(2)fs.chown():用于更改文件所有者和所属组(需管理员权限)。类似于把物品的归属权转移给其他人或团队,传入文件名、新所有者和所属组参数,就能完成文件归属变更。2.文件操作文件权限管理3.流处理在Node.js中,使用fs模块创建可读流和可写流,可读流通过data事件监听数据,可写流通过write()写入数据。流按需分块处理数据,避免内存溢出。(1)创建可读流。通过fs.createReadStream()创建可读流。【验证示例4-4】在文件夹Unit04中创建文件demo0404.js,在该文件中输入以下代码:可读流与可写流3.流处理(2)创建可写流。通过fs.createWriteStream()创建可写流。【验证示例4-5】在文件夹Unit04中创建文件demo0405.js,在该文件中输入以下代码:constfs=require('fs');constwriteStream=fs.createWriteStream('output.txt');writeStream.write('Hello\n');writeStream.end('Node.js');//必须调用end()结束写入运行文件demo0405.js的代码,即可在文本文件output.txt中分别写入Hello和Node.js。可读流与可写流3.流处理管道操作就像把两根水管直接连接起来,让水从一端直接流向另一端,无须手动搬运。在流处理中,pipe()可以将可读流和可写流直接连接,自动处理数据的读取和写入,减少代码量和出错概率。(1)流式文件复制。可读流读取的数据会直接通过管道传输到可写流,实现文件内容的快速复制。【验证示例4-6】在文件夹Unit04中创建文件demo0406.js,在该文件中输入以下代码:constfs=require('fs');constreadStream=fs.createReadStream('input.txt');constwriteStream=fs.createWriteStream('output.txt');readStream.pipe(writeStream);运行文件demo0406.js的代码,即可将文件input.txt中的内容复制到文件output.txt中。管道操作
3.流处理(2)自动传输数据。将可读流数据直接传输到可写流,简化代码并自动处理背压(数据积压)。【验证示例4-7】在文件夹Unit04中创建文件demo0407.js,在该文件中输入以下代码:constfs=require('fs');fs.createReadStream('source.txt').pipe(fs.createWriteStream('target.txt')).on('finish',()=>{console.log('复制完成');});运行文件demo0407.js的代码,即可将文件source.txt中的内容复制到文件target.txt中,并且在终端输出“复制完成”的提示信息。管道操作
3.流处理(3)链式管道(如压缩文件)。【验证示例4-8】在文件夹Unit04中创建文件demo0408.js,在该文件中输入以下代码:constfs=require('fs');constzlib=require('zlib');fs.createReadStream('PASSWD.log').pipe(zlib.createGzip())//压缩流.pipe(fs.createWriteStream('PASSWD.log.gz')).on('finish',()=>{console.log('压缩完成');});运行文件demo0408.js的代码,即可将日志文件PASSWD.log压缩为PASSWD.log.gz,并且在终端输出“压缩完成”的提示信息。管道操作
3.流处理处理大文件时,如果一次性将文件全部读入内存,可能会导致内存溢出,就像用小杯子一次装大量水,水会溢出来一样。而流式文件读写能解决这个问题,它像用小杯子多次少量取水,每次只处理一部分数据。传统读写:一次性加载整个文件到内存,大文件容易导致内存溢出,如readFile()。流式读写:分块处理大文件,内存占用稳定。代码中通过设置highWaterMark控制每次读取的数据量,逐块处理,避免内存溢出。流式文件读写3.流处理【操作要求】在文件夹Unit04中,使用VSCode创建JavaScript文件case0403.js,在该文件中编写代码逐行处理日志文件。【实现过程】在文件夹Unit04中创建JavaScript文件case0403.js,在该文件中输入以下代码:【训练实例4-3】逐行处理日志文件3.流处理流式压缩和解压缩大文件,就像在水流经过水管时,实时对水进行“压缩”或“解压缩”处理。(1)流式压缩后写入文件。使用zlib模块通过可读流读取大文件,经过压缩流处理后,再通过可写流写入压缩文件。【验证示例4-10】在文件夹Unit04中创建文件demo0410.js,在该文件中输入以下代码:大文件处理策略(流式压缩/解压缩)4.文件进阶操作文件遍历类似在图书馆按书架逐层找书,可通过递归调用fs.readdir()遍历文件夹。fs.readdir()可遍历文件夹及其子文件夹下的所有文件,配合递归函数能实现深度遍历,常用于批量处理或统计文件数量等。文件遍历说明:fs.readdirSync()为同步方法,异步方法需用fs.readdir()配合回调,通过path.join()确保跨平台路径格式正确,通过stats.isDirectory()判断是否为文件夹。同步方法(readdirSync())简单但可能阻塞主线程,大文件夹建议用异步方法。第三方库readdirp可简化递归遍历,支持过滤和深度控制。异步优化:可使用mises.readdir()结合async/await避免阻塞主线程。4.文件进阶操作类似监控摄像头,fs.watch()可实时监听文件夹或文件的修改、创建、删除等事件,适用于自动刷新、日志监控等场景。使用示例:constwatcher=fs.watch('./config.json',(eventType,filename)=>{if(eventType==='change'){console.log('${filename}被修改了');}});//关闭监听(避免内存泄漏)setTimeout(()=>watcher.close(),60000);在Windows操作系统下,fs.watch()可能不稳定,推荐使用chokidar库增强跨平台兼容性。部分操作系统将修改文件名视为rename事件,需结合fs.stat()检查原文件路径是否存在。文件监控与变更检测
4.文件进阶操作对JSON文件的操作类似将书信装入信封(序列化JSON.stringify())和拆信读取书信(反序列化JSON.parse()),操作时需注意文件编码和异常处理等问题。(1)读取JSON文件。基本用法:constdata=JSON.parse(fs.readFileSync('data.json','utf8'));console.log();(2)写入JSON文件。基本用法:constnewData={name:'Node.js',version:18};fs.writeFileSync('data.json',JSON.stringify(newData,null,2));//格式化缩进错误处理:读取时需捕获JSON.parse()的语法错误,如文件内容损坏。异步安全:使用mises避免回调地狱。操作JSON文件
4.文件进阶操作【验证示例4-13】在文件夹Unit04中创建文件demo0413.js,在该文件中输入以下代码:constfs=require('fs');//写入JSON文件(序列化)constuserData={name:'张珊',age:21,hobbies:['旅游','羽毛球']};fs.writeFileSync('./user.json',JSON.stringify(userData,null,2),'utf8');console.log('JSON文件写入完成');//读取JSON文件(反序列化)try{constdata=fs.readFileSync('./user.json','utf8');constparsedData=JSON.parse(data);console.log('读取的用户数据:',parsedData);}catch(error){console.error('JSON解析失败:',error.message);}4.文件进阶操作处理GBK编码文件类似翻译外文书籍,Node.js默认仅支持UTF-8编码,不支持GBK编码,需通过第三方库(如iconv-lite库)将GBK编码转换为UTF-8编码以便于处理。处理GBK编码文件的主要场景如下。①
处理Windows操作系统生成的GBK日志文件。②
解析老旧系统导出的GBK格式数据。③
与Java/.NET等GBK兼容系统对接时需要进行数据转换。处理GBK编码文件4.文件进阶操作实例步骤与代码如下。(1)安装库。执行以下命令安装iconv-lite库:npminstalliconv-lite其他编码库:iconv(需编译),但iconv-lite更轻量化。(2)定义读取GBK编码文件的方法。(3)定义写入GBK编码文件的方法。functionwriteGbkFile(filePath,content){//将UTF-8字符串转换为GBK缓冲区constbuffer=iconv.encode(content,'gbk');fs.writeFileSync(filePath,buffer);}(4)调用已定义的方法读取GBK编码文件与写入GBK编码文件。处理GBK编码文件编写程序,演示Node.js中流的基本用法,通过管道将可读流和可写流连接,实现大量数据的流式处理,避免一次性加载全部数据。具体要求如下。(1)可读流的基本操作。从数组source中逐个读取元素(a,b,c,d,e)。每次调用read()时,使用shift()取出数组的第1个元素,并通过push()将数据传递给下游。当数组为空时,push(null)表示流结束。(2)可写流的基本操作。接收上游传递的数据块,将其转换为大写格式并输出。使用setTimeout()模拟100毫秒的异步处理延迟,处理完成后调用callback()通知流继续写入下一个数据块。(3)管道连接的基本操作。使用readable.pipe(writable)将可读流和可写流连接,自动管理数据的流动和背压。当处理完所有数据后,finish事件触发,输出“Alldataprocessed”。任务4-1模拟异步数据流处理任务描述任务4-1模拟异步数据流处理任务实施编写程序,逐行读取CSV文件data.csv并将其解析为二维数组,分行输出解析结果。任务4-2CSV文件解析与输出任务描述1.编写代码任务实施任务4-3环境特定配置加载与输出任务实施编写程序,加载环境特定配置并返回合并后的配置对象,支持默认配置与环境特定配置的层级覆盖。具体要求如下。(1)配置加载策略。从.env.default加载默认配置(所有环境共享)。从.env.{环境名}加载环境特定配置(如.duction),该文件不存在时自动忽略。环境名默认取自process.env.NODE_ENV,未设置时使用development。(2)配置合并规则。环境特定配置会覆盖默认配置中的同名键。采用浅合并(ShallowMerge),不支持
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026网红商品面试题及答案
- 2026物业前景面试题及答案
- (2026年)委托借款合同范本
- 2026年二手房买卖合同
- 购车合同购车合同范本
- 阳春市方兴农业蚕桑产业园项目环境影响报告书
- 湖南理工职业技术学院专任教师招聘考试真题2025
- 湖北十堰竹山兴竹国有资本投资集团有限公司招聘笔试真题2025
- 2025-2026学年江西省上饶市鄱阳县四年级数学下学期期中达标检测模拟试题(含答案)
- 护理员岗位操作规范培训课件
- 2025-2026学年小学一年级(下)期末数学试卷
- 云计算平台建设验收规范
- 2026年共产党党章知识竞赛试题库(附答案)
- 住宅居住区建筑规划设计(图文)
- 供应商管理制度范本
- 《子痫前期-子痫》课件
- 《齐文化简单介绍》课件
- 解除实习协议通知书
- JJG 949-2011经纬仪检定装置检定规程
- 市技能大师工作室建设方案
- 地质勘探行业生产安全事故致因分析
评论
0/150
提交评论