node读取文件操作

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

大家好,又见面了,我是你们的朋友全栈君。

导言: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('操作系统缓存区中的数据已全部输出');
    });
});

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/139599.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ESP8266模块使用完整教程「建议收藏」

    在我入门ESP8266小黄板的过程中,过程是艰难的,因为网络上的资料太多太乱,官网上的资料不算太完备,而在技术交流群里面的就更乱了,所以想按自己学习所总结到的经验来分享给大家。资源链接:http://pan.baidu.com/s/1i4qjrY9请使用本教程之前先下载以上资源。前言:esp8266我用到的是小黄板测试板,而ESP8266主要有两种固件,一种是AT固件,一种是IOT固件。前者用串

  • 无锡梅里旅游策划方案——中国第一锡宫!

    无锡梅里旅游策划方案——中国第一锡宫!无锡梅里旅游策划方案——中国第一锡宫!熊大寻旅游策划公司/文无锡梅里古都”,位于无锡新区梅村,是吴文化的发祥地。梅村古名梅里,早在三千二百多年前,西周周太王长子泰伯,为达成父王想立三子季历的愿望,偕二弟仲雍托辞采药,夜奔江南,拴马于枯树桩。到清早,见枯枝上梅花朵朵,喜出望外,顿悟此地当为宝地。于是为其取“梅里”之名,定居于此。勾吴之国,由此发端。因泰伯三让两家天下,孔子称其为“至德”,司马迁的…

  • linux终端使用gcc为什么显示未找到命令_linux下编译c程序

    linux终端使用gcc为什么显示未找到命令_linux下编译c程序ai0909于2011-11-0114:21:05发表:{:2_97:}itank于2011-02-2715:26:44发表:你试试gcchello.c-ohellowusmliao于2010-11-2519:46:00发表:求答案vfdff于2010-11-1412:29:29发表:使用whichgcc查看,如果没有则添加环境变量troy268于2…

    2022年10月13日
  • 一张色环图教你搞定配色![通俗易懂]

    一张色环图教你搞定配色![通俗易懂]一张色环图教你搞定配色!不管是在平面设计或网页制作中,还是在平常生活中的衣服穿搭和室内装潢中,要想打造出非凡的视觉效果,合理的颜色搭配非常重要。下面介绍几种色彩搭配方案供您参考,让你轻易地一靶中的

  • 乌班图pycharm激活码2022年_在线激活2022.02.12

    (乌班图pycharm激活码2022年)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html4K…

  • Jquery Ajax 跨域调用asmx类型 WebService范例

    Jquery Ajax 跨域调用asmx类型 WebService范例Ajax在Web2.0时代起着非常重要的作用,然而有时因为同源策略(SOP)(俗称:跨域问题(crossdomain))它的作用会受到限制。在本文中,将学习如何克服合作限制。本文以asmx方式搭建webservice作为测试用后端,给出完整的前后端调用解决方案、范例代码。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号