Node.js后端开发 - 基础篇 #6 读写文件(同步,异步)_writefilesync-程序员宅基地

技术标签: node.js  nodejs后端开发  前端  javascript  

文章目录

同步

readFileSync方法

writeFileSync方法

异步

readFile方法

writeFile方法


上一篇文章我们介绍了nodejs的事件,如新建或继承事件对象,绑定事件对象等,详见: Node.js后端开发 - 基础篇 #5 事件 这篇文章我们将介绍nodejs的读写文件(同步,异步),那么怎么读写文件?怎么把文件的内容读取出来,然后再把它写到另一个文件中,并且通过这篇文章我们来简单理解同步和异步的关系。好了废话少说,我们来开始编码!

同步

readFileSync方法

我们可以在app.js里面写入以下代码:

//导入nodejs文件系统的一个库
var fs = require('fs');

//参数1:文件名路径,路径需要加双引号。
//因为是当前目录,所以直接可以写文件名  
//参数2:编码格式
var readMe = fs.readFileSync("readMe.txt","utf-8");

我们手动新建一个文件readMe.txt,写入内容:读我啊 read me

   

我们来看一看读取出来的结果:

MacBook-Pro:hello-nodejs luminal$ node app
读我啊 read me
MacBook-Pro:hello-nodejs luminal$ 

writeFileSync方法

下面我们来看看写的方法,代码如下:

var fs = require('fs');

var readMe = fs.readFileSync("readMe.txt","utf-8");

//参数1:要写入的文件名路径。没有的话,它会自动新建
//参数2:要写入的内容。
fs.writeFileSync("writeMe.txt", readMe);
//fs.writeFileSync("writeMe.txt", "190910马老师-怒放的生命");

我们来看看输出结果:

MacBook-Pro:hello-nodejs luminal$ node app
MacBook-Pro:hello-nodejs luminal$ 

因为是写入操作,我们没有日志输出,下面我们会发现当前目录,自动生成了一个 writeMe.txt 的文件

上面是把 readMe 这个对象的内容写进去了。

当然你也可以自定义内容写进去 fs.writeFileSync("writeMe.txt", "190910马老师-怒放的生命");  这个结果就不贴图了!

异步

readFile方法

上面演示的 readFileSync、writeFileSync都是同步方法,其实sync英文就是同步的意思,那么有同步就必然有异步,下面我们来看看下面的代码

var fs = require('fs');

var readMe = fs.readFileSync("readMe.txt","utf-8");

console.log(readMe);

console.log("finished");

我们来看看输出结果:

MacBook-Pro:hello-nodejs luminal$ node app
读我啊 read me
finished
MacBook-Pro:hello-nodejs luminal$ 

意思上面四行代码是同步执行的,从头到尾一行一行依次执行下来。那如果文件"readMe.txt"非常大,那么这个读取的时间就会很长,后面要执行的内容只能排队等待执行,那么这种情况显然不合理!

nodejs执行JavaScript的时候它是单线程的,这里要注意的是:我并没有说nodejs是单线程的。这种I/O操作,比如说像数据库连接是很常见的,也是最耗时的。那么怎么来解决这个问题呢?这个时候我们可以用到异步,下面我们修改一下代码如下:

var fs = require('fs');

var readMe = fs.readFile("readMe.txt","utf-8",function(err, data) {
    console.log(data);
});

// 延迟5秒执行。我们可以用这个模拟感受下,阻塞的状态!
//也就是说,有如下耗时的同步操作,那就会阻塞整个线程的运行,
//就算是上面异步的方法,也会被阻塞。当遇见这种情况,这时候你写nodejs,
//都是要用异步的方法来处理
//var waitTill = new Date(new Date().getTime() + 5 * 1000);
//while (waitTill > new Date()) {}

console.log("finished");

我们来看看输出结果:

MacBook-Pro:hello-nodejs luminal$ node app
finished
读我啊 read me
MacBook-Pro:hello-nodejs luminal$ 

我们会发现 “finished” 先输出出来了,那么怎么回事呢?

readFile是一个异步方法,修改的代码执行的是异步事件、异步的I/O操作,nodejs执行JavaScript的时候它是单线程的,上面代码的语句还是一行一行的执行的。那么 “finished” 为什么会先输出出来?

其实是这样的,nodejs它维护了一个事件队列,上面三行语句中,第一句还是会先执行,执行第二句的时候它就在事件队列当中注册了一个事件,告诉这个事件队列,我将要去读取一个文件。但是里面的回调函数并没有被马上执行,这个操作是瞬间完成的,完成之后它就会执行主线程的第三条语句 console.log("finished");  

当主线程空闲的时候,它就会去找事件队列里面的事件,把它取出来。在此同时发起一个线程去执行事件队列里面的事件,在这里是读取一个文件,当读完成功以后,它再告诉主线程我已经执行成功。

因为I/O操作它有时候是很耗时的,你不能阻塞别的操作,不能让别的操作一直在等待它的执行,应该是开启另一个线程就执行这个I/O操作,它执行成功以后再通知主线程去执行它。

writeFile方法

有readFile方法必然会有与之对应的writeFile方法,下面我们来看看代码:

var fs = require('fs');

// var readMe = fs.readFile("readMe.txt","utf-8",function(err, data) {
//     console.log(data);
// });
var data = "写写写";
fs.writeFile("writeMe.txt", data, function() {
    console.log("写入完毕!");
});

console.log("finished");

我们来看看输出结果:

MacBook-Pro:hello-nodejs luminal$ node app
finished
写入完毕!
MacBook-Pro:hello-nodejs luminal$ 

同样的,writeFile方法也是异步的方法,所以"finished"先输出。同时我们会发现,写入的内容已经写进去了,如下图:

可参考的api:

File System | Node.js v9.11.2 Documentation

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/YuDBL/article/details/100749100

智能推荐

DSP之TMS320F28335学习总结与笔记(二)————ADC模块_dsp2833x_adc.c-程序员宅基地

文章浏览阅读1.2w次,点赞13次,收藏138次。F28335 ADC模块ADC转换模块A/D转换器(ADC)将模拟量转换为数字量通常要经过四个步骤:采样、保持、量化和编码。采样:将一个时间上连续变化的模拟量转化为时间上离散变化的模拟量。保持:将采样结果存储起来,直到下次采样,这个过程称作保持。一般,采样器和保持电路一起总称为采样保持电路。量化:将采样电平归化为与之接近的离散数字电平,这个过程称作量化。ADC关键指标分辨率:指数字量变化一个最小量时模拟信号的变化量,定义为满刻度与2^n的比值。分辨率又称为精度,通常以数字信号的位_dsp2833x_adc.c

V-rep学习笔记:机器人路径规划2-程序员宅基地

文章浏览阅读1.8k次。   路径规划问题是机器人学研究的一个重要领域,它是指给定操作环境以及起始和目标的位置姿态,要求选择一条从起始点到目标点的路径,使运动物体(移动机器人或机械臂)能安全、无碰撞地通过所有的障碍物而达到目标位置。路径规划从研究对象上可分为关节式机械臂和移动机器人。一般来讲前者具有更多的自由度,而后者的作业范围要更大一些,这两类对象具有不同的特点,因此在研究方法上略有不同。在V-rep学习笔记:机器人路..._collision pairs

问题:U8的存货同步到本地时,报“数据库可能存在相同的编码”_数据库可能已经存在相同的编码等-程序员宅基地

文章浏览阅读1.5k次。1.环境:U8与本地某程序。跨服务器、跨数据库。2.问题:U8的存货同步到本地时,报“数据库可能存在相同的编码”。3.原因:在确认了U8程序正常、本地程序正常、U8数据库正常、本地数据库正常、链接服务器正常、触发器本身正常后,回到了问题的本身:为何原来的同步执行正常,但是现在的存货保存却异常,怀疑是最新的存货有问题。所以先停了触发器,然后用U8做了一个存货,正常保存后。启用触发器,直接用刚_数据库可能已经存在相同的编码等

EOS与ESD的区别_eos和esd的区别-程序员宅基地

文章浏览阅读7.9k次。摘要:什么是EOS?EOS与ESD的区别是什么?EOS为ELectrical Over Stress的缩写,指所有的过度电性应力。当外界电流或电压超过器件的最大规范条件时,器件性能会减弱甚至损坏。一、什么是EOS?EOS为ELectrical Over Stress的缩写,指所有的过度电性应力。当外界电流或电压超过器件的最大规范条件时,器件性能会减弱甚至损坏。EOS通常产生于:1.电源(AC/DC) 干扰、电源杂讯和过电压。2.由于测试程序切换(热切换)导致的瞬变电流..._eos和esd的区别

API网关之动态路由_api路由-程序员宅基地

文章浏览阅读1.3k次。AIP网关 动态路由_api路由

强一致性 弱一致性 最终一致性-程序员宅基地

文章浏览阅读4.5k次,点赞4次,收藏22次。在足球比赛里,一个球员在一场比赛中进三个球,称之为帽子戏法(Hat-trick)。在分布式数据系统中,也有一个帽子原理(CAP Theorem),不过此帽子非彼帽子。CAP原理中,有三个要素:一致性(Consistency)可用性(Availability)分区容忍性(Partition tolerance)CAP原理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。因此在进行分..._强一致性 弱一致性 最终一致性

随便推点

POJ - 2096 Collecting Bugs_poj collecting bugs-程序员宅基地

文章浏览阅读184次。Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stuff, he collects software bugs. When Ivan gets a new program, he classifies all possible bugs into n ..._poj collecting bugs

ESP32单片机入门篇-程序员宅基地

文章浏览阅读8.8k次,点赞11次,收藏88次。ESP32单片机是一款基于改进的Tensilica LX6微架构的32位双核处理器 SoC,配备2.4 GHz Wi-Fi和蓝牙功能。由于其低功耗、高速度和广泛的应用适用性而被广泛应用。本文将介绍ESP32单片机的基本概念,开发环境,开发语言和一些注意事项,并提供一些简单的代码例程,以点亮LED灯和控制继电器为例。_esp32

Java WEB开发基础知识-程序员宅基地

文章浏览阅读2.9w次,点赞53次,收藏319次。一、WEB应用程序B/S ( browser/server ,浏览器/服务器)架构基于HTTP传输协议(超文本传输协议,回忆HTML的名字:超文本标记语言)WEB程序必须要运行在web容器上,如Tomcat /Jboss/WebLogic等二、HTTP协议HTTP使用TCP作为它的支撑运输层协议,默认的端口是80(缺省端口)。超文本传输协议(Hypertext Transfer Protocol,..._java web开发

SQL语句操作优先级顺序_inner left优先级-程序员宅基地

文章浏览阅读1.7w次,点赞4次,收藏18次。SQL语句操作优先级顺序原文所在SQL 不同于与其他编程语言的最明显特征是处理代码的顺序。在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后被处理。 每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回_inner left优先级

C51单片机:点击一次按键,实现LED显示状态的亮灭转变_单片机按键按一次亮一个灯-程序员宅基地

文章浏览阅读9.1k次,点赞3次,收藏30次。#include <REGX52.H>sbit led=P1^0;//p1.0口接ledsbit button=P3^0;//p3.0口接控制int i,j;//整数i,jvoid main( )//主函数{ led=1;//led初始状态 while(1)//循环 { if(button==0)//按下开关 { for(i=0;i<10;i++);//延时去抖 while(button==0);//检测松手 l._单片机按键按一次亮一个灯

Python 爬取红酒网站https://www.vivino.com_vivino网站爬虫-程序员宅基地

文章浏览阅读2.6w次。用到了进程池,代理import requestsimport jsonimport jsonpathimport pymysqlimport queuefrom multiprocessing import Poolimport randomrequests.packages.urllib3.disable_warnings()# 创建连接db = pymysql.c..._vivino网站爬虫