nodejs-API-fs文件系统
这个是集成在node里面的
node,读写文件也有同步和异步的接口
node就是异步写的nb
java和python都是同步来获取我们磁盘的数据,而且同步不用搞一些同步之类的
但node肯定要用到回调函数(异步)来执行一些异步的操作
node-fs的俩种方式:
同步
首先要打开文件:
fs.openSync
path:文件路径flags:标识,你是写入还是读取mode:读取的时候的一个模式
var fs = require('fs')//首先open打开var fd = fs.openSync('./hello.txt','r')console.log(fd)
node xxx.js
但是你还是拿不到里面的内容,
得到的是一个标识(第几个窗口),它确实打开了,但是是在内存里面打开了
拿到标识通过读取的方式去获取内容:
就要用到fs.readSync
需要一个缓存区(Buffer内存开辟出来的缓存区)
高度封装,如果不行就使用fs.readFileSync
var content = fs.readFileSync('./hello.txt',{flag:'r',encoding:'utf-8'})
如果下面有一个
var content = fs.readFileSync('./hello.txt',{flag:'r',encoding:'utf-8'})console.log(123)
如果是同步则要等上一句执行完后才能输出123
异步
在node里面默认就是异步的
fs.open
path:文件路径flags:标识,你是写入还是读取callback:回调
如果文档里面写options的接口
那它就要你传入一个对象进去
异步不会让系统停下来,也不会赋值,所以要给你一个回调函数:
fs.readFile('./hello.txt',{flag:'r',encoding:'utf-8'},function(){console.log(456)})console.log(123)
这里先是123先输出,读取完文本的时候才输出456
回调函数由俩个形参,一个是error(错误) , 一个是data数据
fs.readFile('./hello.txt',{flag:'r',encoding:'utf-8'},function(err,data){if(err){console.log(err)}else{console.log(data)}console.log(456)})console.log(123)
输出:
123hello world456
对于异步来说,我们结果可以封装成Promise对象的形式(Promise)
对原生读文件的方式进行封装:
function myFsReadFile(path){return new Promise(function(resolve,reject){fs.readFile(path,{flag:'r',encoding:'utf-8'},function(err,data){if(err){reject(err)}else{resolve(data)}})})}
封装完后读取文件的写法就可以:
var w1 = myFsReadFile('./hello.txt')w1.then(function(res){console.log(res)})
async function可以参考这个
了解async function:
async function asyncCeShiFun(){return 'hello?';}//Promise { 'hello?' }console.log(asyncCeShiFun())asyncCeShiFun().then(v=>{console.log(v)})
输出为:
Promise { 'hello?' }hello?
async function于await:
菜鸟教程解释:async 函数中可能会有 await 表达式,async 函数执行时,如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值。
await
await 操作符用于等待一个 Promise 对象, 它只能在异步函数 async function 内部使用。
function delayms(m){return new Promise((resolve) => {setTimeout(function(){console.log('定时器里的log输出了')resolve();},m)})}async function asyncCeShiFun(){await delayms(2000)console.log('async funtion里的log输出了')setTimeout(()=>{console.log('等待2秒')},2000)}asyncCeShiFun()
这个例子的输出结果是:
定时器里的log输出了async funtion里的log输出了等待2秒
人话:先执行await里面的代码。在受await影响的代码没有执行完之前,方法里的代码不会执行
写读取多个文本
async function ReadList(){var file = await myFsReadFile('hello.txt')console.log(file)}ReadList()
你会发现未来的很多框架来写或读取相关的数据
用异步的方式来写,因为同步的方式会降低我们的效率,因为同步它要等
