Node.js内置的fs模块就是文件系统模块,负责读写文件。

和所有其它JavaScript模块不同的是,fs模块同时提供了异步和同步的方法。

回顾一下什么是异步方法。因为JavaScript的单线程模型,执行IO操作时,JavaScript代码无需等待,而是传入回调函数后,继续执行后续JavaScript代码。比如jQuery提供的getJSON()操作:

$.getJSON('http://example.com/ajax', function (data) {console.log('IO结果返回后执行...');
});
console.log('不等待IO结果直接执行后续代码...');

而同步的IO操作则需要等待函数返回:

// 根据网络耗时,函数将执行几十毫秒~几秒不等:
var data = getJSONSync('http://example.com/ajax');

同步操作的好处是代码简单,缺点是程序将等待IO操作,在等待时间内,无法响应其它任何事件。而异步读取不用等待IO操作,但代码较麻烦。

异步读文件

按照JavaScript的标准,异步读取一个文本文件的代码如下:

'use strict';var fs = require('fs');fs.readFile('sample.txt', 'utf-8', function (err, data) {if (err) {console.log(err);} else {console.log(data);}
});

请注意,sample.txt文件必须在当前目录下,且文件编码为utf-8

异步读取时,传入的回调函数接收两个参数,当正常读取时,err参数为nulldata参数为读取到的String。当读取发生错误时,err参数代表一个错误对象,dataundefined。这也是Node.js标准的回调函数:第一个参数代表错误信息,第二个参数代表结果。后面我们还会经常编写这种回调函数。

由于err是否为null就是判断是否出错的标志,所以通常的判断逻辑总是:

if (err) {// 出错了
} else {// 正常
}

如果我们要读取的文件不是文本文件,而是二进制文件,怎么办?

下面的例子演示了如何读取一个图片文件:

'use strict';var fs = require('fs');fs.readFile('sample.png', function (err, data) {if (err) {console.log(err);} else {console.log(data);console.log(data.length + ' bytes');}
});

当读取二进制文件时,不传入文件编码时,回调函数的data参数将返回一个Buffer对象。在Node.js中,Buffer对象就是一个包含零个或任意个字节的数组(注意和Array不同)。

Buffer对象可以和String作转换,例如,把一个Buffer对象转换成String:

// Buffer -> String
var text = data.toString('utf-8');
console.log(text);

或者把一个String转换成Buffer

// String -> Buffer
var buf = Buffer.from(text, 'utf-8');
console.log(buf);

同步读文件

除了标准的异步读取模式外,fs也提供相应的同步读取函数。同步读取的函数和异步函数相比,多了一个Sync后缀,并且不接收回调函数,函数直接返回结果。

fs模块同步读取一个文本文件的代码如下:

'use strict';var fs = require('fs');var data = fs.readFileSync('sample.txt', 'utf-8');
console.log(data);

可见,原异步调用的回调函数的data被函数直接返回,函数名需要改为readFileSync,其它参数不变。

如果同步读取文件发生错误,则需要用try...catch捕获该错误:

try {var data = fs.readFileSync('sample.txt', 'utf-8');console.log(data);
} catch (err) {// 出错了
}

转载:https://www.liaoxuefeng.com/wiki/1022910821149312/1023025763380448

fs.readFile和fs.readFileSync的区别相关推荐

  1. node.js中fs.readFile和fs.readFileSync的使用

    博客由来: var admins;var admins2;await fs.readFile(path.resolve(__dirname,'../../admins.json'),function( ...

  2. Node.js: fs.readFile/writeFile 和 fs.createReadStream/writeStream 区别

    1. 先说说各自的用法: How do I read files in node.js? fs = require('fs'); fs.readFile(file, [encoding], [call ...

  3. 模板引擎不关心内容之——art-template,碰见的同步与fs.readFile异步以及函数回调问题的描述,针对fs的readfille读取文件时,返回不了异步函数返回值的解决方法

    模板引擎不关心内容 art-template art-template不仅可以在浏览器使用,也可以在node中使用 npm install art-template该命令在哪执行就会把包下载在哪里,默 ...

  4. js处理本地.bin音频文件和node.js的fs模块处理本地.bin音频区别

    1.js处理本地.bin文件 <body><input type="file" name="" id="fileInput" ...

  5. java readfile函数_从fs.readFile获取数据

    回答(13) 2 years ago 在ES7中使用Promise 与mz / fs异步使用 mz模块提供核心节点库的promisified版本 . 使用它们很简单 . 首先安装库... npm in ...

  6. fs.readfile 显示html,从fs.readFile获取数据

    小编典典 为了详细说明@Raynos所说的内容,您定义的函数是一个异步回调.它不会立即执行,而是在文件加载完成后执行.当您调用readFile时,将立即返回控件并执行下一行代码.因此,当您调用cons ...

  7. fs.readfile 显示html,javascript – 从fs.readFile获取数据

    要详细说明@Raynos说,你定义的函数是异步回调.它不会立即执行,而是在文件加载完成时执行.当调用readFile时,将立即返回控制并执行下一行代码.因此,当您调用console.log时,您的回调 ...

  8. VScode运行fs.readFile时报错no such file or directory或无法输出data或undefined

    这个问题我在网上查找解决办法的时候大多都是说异步的问题,然而用了那些所谓的解决办法后还是输出不了data的值,显然不是异步的问题,今天记录下踩坑. 如果Code Runner插件配置完毕,可以跳过第一 ...

  9. node.js:fs.open 和 fs.write 读取文件和改写文件

    node.js fs.open 和 fs.write 读取文件和改写文件 Node.js的文件系统的Api //公共引用 var fs = require('fs'), path = require( ...

最新文章

  1. 基于HTML5的Google水下搜索
  2. js字符串的各种格式的转换 ToString,Format
  3. c语言坐标三角形判断,【C语言】判断三角形类型(示例代码)
  4. Linux记录-CPU指标介绍
  5. C++中include 与 include 的区别
  6. SVN 清理失败解决方案
  7. Invoke and BeginInvoke BeginInvoke和EndInvoke方法 (转)
  8. leetcode python3 简单题1.Two Sum
  9. 基于 iso 镜像构建 yum 本地源
  10. Go语言 for循环案例
  11. Java实现简单的QQ登录界面
  12. 动手学 《动手学深度学习》(安装pytorch)
  13. 波士顿学院计算机科学专业,波士顿学院计算机专业好吗?_托普仕留学
  14. 数商云大宗商品交易平台案例:打造B2B大宗电商供应链服务系统,落地产业互联网
  15. 关于制作FlappyBird无限地面的一些问题
  16. 更省密令是什么?更省密令填什么
  17. 相似图片搜索、算法、识别的原理解析(上)
  18. 基于思科模拟器进行子网划分
  19. 用.bat文件打开程序
  20. Zircon 与 LK

热门文章

  1. swift 和 oc混编 找不到头文件等问题
  2. linux下的iic驱动程序,实战经验吐血推荐:怎样在Linux环境下轻松实现基于I2C总线的EEPROM驱动程序...
  3. 贝叶思咨询:中国手机游戏的创业机会
  4. Codeforces Round #811 (Div. 3)
  5. [网络安全技术文章之其一] 给数据科学家的十条数据安全建议
  6. uefi安装win10原版镜像|uefi gpt模式安装win10官方系统教程
  7. mysql虚拟主机_远程连接mysql要点 虚拟主机定义与分类
  8. 沈梦黑发骗子骗术揭秘
  9. Windows Update有用吗
  10. 03 KEY BUZZ