当前位置:网站首页>基本文件操作
基本文件操作
2022-06-21 16:47:00 【谷哥学术】
Node.js使用流(Stream)的方式来处理文件。这种处理方式和处
理网络数据几乎是一样的,操作起来非常方便。使用流的方式操作一
般会有一个问题,即无法在文件的指定位置进行读写。但是Node.js进
行了更底层的操作,除了可以在文件的尾部写入,也可以在文件的特
定位置写入数据。
Node.js中有丰富的API支持对文件的各种操作,包括获取文件信
息、创建和删除文件、打开和关闭文件、读写数据。在本节中将会介
绍文件的一些基本操作,下一节会针对具体格式的文件操作进行讲
解。
- 打开文件
在处理文件之前都需要调用Node.js中的fs.open方法来打开文
件,然后才能使用文件描述符调用所提供的回调函数。在异步模式下
打开文件的语法如下:
fs.open(path, flags[, mode], callback)
参数使用说明如下:
path:文件的路径。
flags:文件打开的方式,具体说明可参见表5.1。
mode:设置文件模式(权限),文件创建默认权限为可读写。
callback:回调函数,同时带有两个参数。
下面的代码将打开一个文件,并在打开之前和打开成功之后在
console中显示相对应的消息。
【代码5-8】
- 关闭文件
关 闭 文 件 将 调 用 fs.close 和 fs.closeSync 方 法 。 其 中 ,
fs.closeSync为同步操作的方法。我们在这里主要介绍调用异步的
fs.close方法。它一共有两个参数可以设定,具体语法如下:
fs.close(fd, callback)
参数使用说明如下:
fd:通过 fs.o?en()方法返回的文件描述符。
callback:回调函数,没有参数。
在实际开发过程中,如果打开了一个文件,就应该在文件操作完
成之后尽快关闭该文件,为此可能需要跟踪那些已经打开的文件描述
符,并在操作完成之后确保文件正确关闭。下面的代码将建立一个新
的文本文件,并进行打开文件和关闭文件的操作。
【代码5-9】
【代码说明】
事实上,并不需要经常调用fs.close来关闭文件。除了几种特例
之外,Node.js在进程退出之后将自动关闭所有文件。原因在于,在使
用fs.readFile、fs.writeFile或fs.append之后,它们并不返回任何
fd,Node.js将在文件操作之后进行判断并自动关闭文件。例如,在执
行下面的代码后并不需要调用fs.close来关闭文件。
提示
在调用一些方法的时候,例如fs.createReadStream,在o?tion中
含有autoClose选项。autoClose选项设置为true时,才会在文件操
作之后自动关闭,详细内容请参见相关方法的具体说明或Node.js
的官方手册。
- 读取文件
Node.js目前支持utf-8、ucs2、ascii、binary、base64、hex编
码的文件,并不支持中文GBK或GB2312之类的编码,所以无法操作GBK
或GB2312格式文件的中文内容。如果想读取GBK或GB2312格式的文件,
需要第三方的模块支持,建议使用iconv模块或iconv-lite模块。其
中,iconv模块仅支持Linux,不支持Windows。
在Node.js中读取文件一般调用fs.read方法。该方法从一个特定
的文件描述符(fd)中读取数据,语法格式如下:
fs.read(fd, buffer, offset, length, position, callback)
参数使用说明如下:
fd:通过fs.o?en()方法返回的文件描述符。
buffer:数据写入的缓冲区。
offset:缓冲区写入的写入偏移量。
length:要从文件中读取的字节数。
?osition:文件读取的起始位置,如果?osition的值为null,就
会从当前文件指针的位置读取。
callback:回调函数,有err、bytesRead、buffer三个参数。其
中err为错误信息,bytesRead表示读取的字节数,buffer为缓冲
区对象。
下面的代码是一个文件读取的示例。首先,调用fs.open()方法将
文件打开;然后,从第100个字节开始,读取后面的1024个字节的数
据;读取完成后,fs.open()会使用回调方法返回数据,再处理读取到
的缓冲数据。
【代码5-10】

读取文件也可以调用fs.readFile()方法,语法格式如下:
fs.readFile(filename[, options], callback)
filename:要读取的文件。
options:一个包含可选值的对象。
■ encoding {String | Null}:默认为null。
■ flag {String}:默认为'r'。
callback:回调函数。
fs.readFile方法是在fs.read上的进一步封装,两者的主要区别
是fs.readFile方法只能读取文件的全部内容。
提示
js文件必须保?为UTF8编码格式。使用Node.js开发时,无论是代
码文件还是要读写的其他文件都建议使用UTF8编码格式保?,这样
可以无须额外的模块支持。
- 写入文件
写入文件一般调用fs.writeFile和fs.appendFile方法。两者都可
以将字符串或者缓存区中的内容直接写入文件,如果检测到文件不存
在将创建新的文件。fs.writeFile和fs.appendFile的语法格式也非常
接近,分别如下:
(1)fs.writeFile语法:
fs.writeFile(filename, data[, options], callback)
参数使用说明如下:
path:文件路径。
data : 写 入 文 件 的 数 据 , 可 以 是 string ( 字 符 串 ) 或
buffer(流)对象。
options:该参数是一个对象,包含{encoding, mode, flag},默
认编码为utf-8,模式为0666,flag为 'w'。
callback:回调函数,只包含错误信息参数(err)。
(2)fs.appendFile语法:
fs.appendFile(file, data[, options], callback)
参数说明如下:
file:文件名或者文件描述符。
data:可以是string(字符串)或buffer(流)对象。
options:该参数是一个对象,包含{encoding, mode, flag},默
认编码为utf-8,模式为0666,flag为'w'。
callback:回调函数,只包含错误信息参数(err)。
下面将字符串(string)和流(buffer)作为数据源写入一个文
件中:
【代码5-11】

【代码说明】
在执行写入文件之后,不要使用提供的缓存区,因为一旦将其传
递给写入函数,缓存区就处于写入操作的控制之下,直到函数结束之
后才可以重新使用。
提示
在写入文件时一般要包含写入信息的具体位置,如果以追加模式打
开文件,那么文件的游标位于文件的尾部,因此写入的数据也处于
文件的尾部。
其他文件操作
在实际的编程过程中,我们需要操作多种不同格式的文件。
Node.js除了提供官方的API对文件操作进行支持,也可以通过NPM安装
第三方的模块来进行文件操作。本节主要介绍如何通过Node.js和第三
方模块来操作CSV文件、XML文件和JSoN文件。本节我们以CSV文件为例
来详细介绍。
CSV是一种常见的数据格式。Node.js中有很多模块可以解析CSV文
件,这里建议使用node-CSV来进行文件的解析操作。node-CSV遵循开
源 的 BSD 协 议 , 项 目 在 git 网 站 的 网 址 为
https://github.com/wdavidw/node-CSV。它一共包含4个包,分别为
CSV-generate、CSV-parse、stream-transform和CSV-stringify。各
个包的功能具体如下:
CSV-generate:用来生成标准的CSV文件。
CSV-parse:将CSV文件解析为数组变量。
stream-transform:一个转换框架。
CSV-stringify:将记录转换为CSV的文本。
使用node-CSV时,需要先通过npm命令来安装CSV的包,具体命令
如下:
npm install csv
其中每个包都与stream2和stream3的标准相兼容,并且提供一个
简单的回调函数。CSV-parse解析方法可以使用多种选项,但所有的选
项都是可选的,而不是必需的,参见表5.2。

下面的代码将使用CSV模块中的stream来读取、解析和转换CSV文
件。
【代码5-12】
【代码说明】
首先要调用require('csv')引用csv模块,引用之后,就可以直接
调用它封装的方法和属性了。csv()相当于实例化一个对象,.from()
和.to()都是csv封装的方法。
.from()方法:从源文件中读取数据,参数既可以像上面一样直接
传字符串,也可以像下面的高级应用传源文件的路径。
.to()方法:将从form()方法中读取出来的数据输出,既可以输出
到控制台,也可以输出到目标文件。此例子是输出到控制台。
边栏推荐
- Runmeide Healthcare a réussi l'audience d'inscription sur la liste: les pertes devraient augmenter, Huo Yunfei Brothers détenant environ 33%
- 数字藏品系统开发,NFT艺术品交易平台搭建
- Paper notes ACL 2022 unified structure generation for universal information extraction
- Why is rediscluster designed with 16384 slots?
- How to perform en45545 fire test for battery shell
- [Oracle] is there a "time" data type in oracle-- Research on Oracle data types
- tcpserver开启多线程处理
- SQL操作:WITH表达式及其应用
- EtherCAT object dictionary analysis
- EtherCAT master station based on am4377 controls STM32 slave station
猜你喜欢

Move Protocol Beta测试版进行时,瓜分生态核心权益MOMO

MySQL 1055 error -this is incompatible with SQL_ mode=only_ full_ group_ By solution

众安保险联合阿里健康、慧医天下 探索互联网慢病管理新模式

字节跳动提出轻量级高效新型网络MoCoViT,在分类、检测等CV任务上性能优于GhostNet、MobileNetV3!

大型网站技术架构 | 应用服务器安全防御

大型网站技术架构 | 信息加密技术及密匙安全管理

Stack awareness - stack overflow instance (ret2text)

Pingcap was selected as the "voice of customers" of Gartner cloud database in 2022, and won the highest score of "outstanding performer"

aws elastic beanstalk入门之简介

Laravel实现文件(图片)上传
随机推荐
Stack cognition - Introduction to heap
主动学习(Active Learning) 概述、策略和不确定性度量
海恩法则和费曼学习法
Jetpack compose status promotion (II)
Move Protocol Beta测试版稳定,临时决定奖池规模再扩大
PTA l3-032 questions about depth first search and reverse order pair should not be difficult (30 points)
超分之RLSP
编写第一个C#应用程序——Hello, C#
What is the difference between IEC62133 and EN62133? Which items are mainly tested?
带你区分几种并行
神经网络七十年:回顾与展望
堆栈认知——逆向IDA工具的基本使用
如何使用 DATAX 以 UPSERT 语义更新下游 ORACLE 数据库中的数据
Jetpack compose management status (I)
结构建模设计——Solidworks软件之特征成型中旋转切除与圆角倒角功能实战总结(绘制一个沉头螺丝孔)
堆栈认知——栈溢出实例(ret2text)
多维分析预汇总应该怎样做才管用?
Runmeide Healthcare a réussi l'audience d'inscription sur la liste: les pertes devraient augmenter, Huo Yunfei Brothers détenant environ 33%
Simulation of vector
postman关联,完成接口自动化测试