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)
输出:
123
hello world
456
对于异步来说,我们结果可以封装成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()
你会发现未来的很多框架来写或读取相关的数据
用异步的方式来写,因为同步的方式会降低我们的效率,因为同步它要等