详解nodeJS中读写文件方法的区别


Posted in NodeJs onMarch 06, 2017

导言:nodejs中所有与文件相关的操作都在fs模块中,而读写操作又是我们会经常用到的操作,nodejs的fs模块针对读操作为我们提供了readFile,read, createReadStream三个方法,针对写操作为我们提供了writeFile,write, createWriteStream三个方法,下面分析一下它们的区别:

一、readFile和writeFile

1、readFile方法是将要读取的文件内容完整读入缓存区,再从该缓存区中读取文件内容,具体操作如下:

fs.readFile('./test.txt', 'utf8', function(err, data){
  console.log(data); 
});

与其对应的同步方法为:

var data = fs.readFileSync('./test.txt', 'utf8');
console.log(data);

同步方法和异步方法的区别是:在使用同步方法执行的操作结束之前,不能执行后续代码的执行;而异步方法将操作结果作为回调函数的参数进行返回,方法调用之后,就可以立即执行后续的代码,读取完毕后会调用对应的回调函数。

2、writeFile方法是将要写入的文件内容完整的读入缓存区,然后一次性的将缓存区中的内容写入都文件中,其同步和异步具体操作如下:

//异步方法
fs.writeFile('./message.txt', '这是第一行',function(err){
  if(err) console.log('写文件操作失败');
  else console.log('写文件操作成功');
});

//同步方法
fs.writeFileSync('./message.txt','这是第一行');

以上的读写操作,Node.js将文件内容视为一个整体,为其分配缓存区并且一次性将文件内容读取到缓存区中,在这个期间,Node.js将不能执行任何其他处理。所以当读写大文件的时候,有可能造成缓存区“爆仓”。

二、read和write

1、read或readSync方法读取文件内容是不断地将文件中的一小块内容读入缓存区,最后从该缓存区中读取文件内容,具体操作如下:

var fs = require('fs');
fs.open('./message.txt','r',function(err,fd){
  var buf = new Buffer(225);
  //读取fd文件内容到buf缓存区
  fs.read(fd,buf,0,9,3,function(err,bytesRead,buffer){
    console.log(buf.slice(0,bytesRead).toString());
  }); 
  var buff = new Buffer(225);
  //位置设置为null会默认从文件当前位置读取
  fs.read(fd,buff,0,3,null,function(err,bytesRead,buffer){
    console.log(buff.slice(0,bytesRead).toString());
  });

  var buffer = new Buffer(225);
  //同步方法读取文件
  var bytesRead = fs.readFileSync(fd,buffer,0,9,3);
  console.log(bytesRead);
  console.log(buffer.slice(0,bytesRead).toString());
});

2、write或writeSync方法写入内容时,node.js执行以下过程:1将需要写入的数据写入到一个内存缓存区;2待缓存区写满后再将缓存区中的内容写入到文件中;3重复执行步骤1和步骤2,知道数据全部写入文件为止。具体操作如下:

var fs = require('fs');
var buf = new Buffer('我喜爱编程');
fs.open('./mess.txt','w',function(err,fd){
  fs.write(fd,buf,3,9,0,function(err,written,buffer){
    fs.write(fd,buf,12,3,null,function(err,written,buffer){
      if(err) console.log('写文件操作失败');
      console.log('写文件操作成功');
    });
  });
  //同步写入
  fs.writeSync(fd,buf,3,9,0);
});

以上读写操作,node.js会将文件分成一块一块逐步操作,在读写文件过程中允许执行其他操作。

但有的时候我们并不关心整个文件的内容,而只关注从文件中读取到的某些数据,以及读取到数据时需要执行的处理,这时我们可以使用文件流来处理。

三、createReadStream和createWriteStream

1、createReadStream方法创建一个将文件内容读取为流数据的ReadStream对象,方法如下所示:

var fs = require('fs');
var readStream = fs.createReadStream('./message.txt',{start:3,end:12});
readStream.on('open',function(fd){
  console.log('开始读取文件');
});
readStream.on('data',function(data){
  console.log('读取到数据:');
  console.log(data);
});
readStream.on('end',function(){
  console.log('文件已全部读取完毕');
});
readStream.on('close',function(){
  console.log('文件被关闭');
});
readStream.on('error',function(err){
  console.log('读取文件失败');
});

2、createWriteStream方法创建一个将流数据写入文件中的WriteStream对象,方法如下所示:

var fs = require('fs');
var file = fs.createReadStream('./message.txt');
var out = fs.createWriteStream('./anotherMessage.txt');
file.on('data',function(data){
  out.write(data);
});
out.on('open',function(fd){
  console.log('需要被写入的文件已打开');
});
file.on('end',function(){
  //将操作系统缓存区中的数据全部写入文件
  out.end('再见',function(){
    console.log('文件全部写入完毕');
    console.log('共写入'+out.bytesWritten+'数据');
  });
});

以上方法可以对读写文件的过程中进行监听,并定义相关的方法pause和resume暂停或恢复文件的读取操作,可以监听写入时缓存区数据是否已满或者是否已全部输出,如下所示:

//监听writeStream对象的drain事件
var fs = require('fs');
var out = fs.createWriteStream('./test1.txt');
for(var i=0;i<10000;i++){
  //返回true或false true代表缓存区已满
  var flag = out.write(i.toString());
  console.log(flag);
}
out.on('drain',function(){
  console.log('操作系统缓存区中的数据已全部输出');
  var out = fs.createWriteStream('./test2.txt');
  for(var i=0;i<10;i++){
    var flag = out.write(i.toString());
    console.log(flag);
  }
  out.on('drain',function(){
    console.log('操作系统缓存区中的数据已全部输出');
  });
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
14款NodeJS Web框架推荐
Jul 11 NodeJs
nodejs中转换URL字符串与查询字符串详解
Nov 26 NodeJs
nodejs开发微信小程序实现密码加密
Jul 11 NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 NodeJs
NodeJS服务器实现gzip压缩的示例代码
Oct 12 NodeJs
nodejs使用async模块同步执行的方法
Mar 02 NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 NodeJs
在NodeJs中使用node-schedule增加定时器任务的方法
Jun 08 NodeJs
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
May 30 NodeJs
详谈Angular路由与Nodejs路由的区别
Mar 05 #NodeJs
async/await与promise(nodejs中的异步操作问题)
Mar 03 #NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 #NodeJs
NodeJS仿WebApi路由示例
Feb 28 #NodeJs
Nodejs多站点切换Htpps协议详解及简单实例
Feb 23 #NodeJs
NodeJs下的测试框架Mocha的简单介绍
Feb 22 #NodeJs
基于Nodejs利用socket.io实现多人聊天室
Feb 22 #NodeJs
You might like
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
基于jquery用于查询操作的实现代码
2010/05/10 Javascript
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
javascript根据时间生成m位随机数最大13位
2014/10/30 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
JavaScript实现向setTimeout执行代码传递参数的方法
2015/04/16 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
实现一个简单的vue无限加载指令方法
2017/01/10 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
python3.0 字典key排序
2008/12/24 Python
Python有序查找算法之二分法实例分析
2017/12/11 Python
PyQt5每天必学之组合框
2018/04/20 Python
django解决跨域请求的问题
2018/11/11 Python
tensorflow实现二维平面模拟三维数据教程
2020/02/11 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
周鸿祎:教你写创业计划书
2013/12/30 职场文书
竞选班长自荐书范文
2014/03/09 职场文书
安全生产责任书范本
2014/04/15 职场文书
领导干部作风建设工作总结
2014/10/23 职场文书
2014年化工厂工作总结
2014/11/25 职场文书
2014年房地产个人工作总结
2014/12/20 职场文书
老兵退伍感言
2015/08/03 职场文书
Hive HQL支持2种查询语句风格
2022/06/25 数据库