代码示例:
下方的示例是同步和异步的不同操作,注释的为异步的,未注释的是同步的操作
操作内容为,打开一个文件,若文件夹中没有,会自己创建,然后第二个参数是flag,可以选择写’w’或者读’r’等其他操作,但是若写了‘r’,要读取这个文件但是没有时会报错 r: ENOENT: no such file or directory, open ‘hao1.txt’
//引入fs模块
let fs = require('fs');
//同步打开demo1.txt文件,写入得操作,在这里,若没有demo1文件,会自己创建
let fd = fs.openSync('demo1.txt','w');
//这是异步打开文件的操作,同样执行写的操作,与同步不同是有回调函数,err是失败,fd是代表所打开的文件,在node.js中异步操作是没有返回值一说的,若想在打开的文件成功后,进行下一步操作,比如写入并关闭文件,是必须放在打开文件的回调函数中的,否则就会报错
// fs.open('demo1.txt', 'w', function (err, fd) {
// if (err) {
// console.log(err)
// } else {
// console.log('chulaioloohdfiduh')
// // console.log(fd)
//在打开文件成功后写入文件
// fs.writeFile(fd, 'gfglSJbfSBdjabsdhasdasdbajsgdjssdsdhsdkfdkfkdksfdfdhkdhfdk', (err) => {
// if (err) throw err;
// console.log('保存了')00
//写完文件关闭这个文件,异步执行,有回调函数
// fs.close(fd, (err) => {console.log(222)})
// });
// }
// });
//同步写入文件
fs.writeFileSync(fd,'我只愿面朝大海,春暖花开');
//写入文件后关闭这个打开的文件
fs.closeSync(fd);
读取文件异步操作的示例代码:
//引入fs模块
let fs = require('fs');,
//读取wenjian.text文件,没有的话会报错,异步请求有callback,err是错误,data是读取的二进制数据
fs.readFile('wenzi.text',(err,data)=>{
if(!err){ //如果成功调用下列代码
console.log(data)
console.log(data.toString())
}else{ //失败就抛出异常,具体代码操作按实际需求来写
throw err
}
})
demo需求:读取本地图片文件,然后写入到当前文件的同一路径下
//引入fs模块
let fs = require('fs');,
//首先读取图片文件,异步操作,有回调函数
fs.readFile('d:\\Users\\Administrator\\Desktop/1.png', (err,data)=>{
//如果成功的话
if(!err){
//将读出的data数据,写入当前目录下,并起名为img.png
fs.writeFile('./img.png',data,(err)=>{
if(err){
throw err
}else{
console.log(data)
}
})
}else{
throw err
}
})
创建读取流
首先,要了解流的作用:在于文件太大,读取太久,或者上传太久,影响体验,其实是影响代码的运行,变相增加运行时间;读取操作会放在内存中,若无其他操作会立即释放,但若文件过多或过大,会占用内存。容易宕机,所以Stream流是很有必要使用的
//引入fs模块
let fs = require('fs');
//创建一个读取流
var wl = fs.createReadStream('test1.txt')
//监听open读取流打开的事件
wl.once('open',()=>{
console.log('创建读取流....')
})
//监听读取流.关闭的事件
wl.once('close',()=>console.log('关闭读取流....'))
console.log(wl)
//关闭读取流
wl.end()
读取流和写入流的使用,demo要求:读取一个本地的mp3文件,然后写入到当前路径下的test.mp3
//创建读取流,读取一个本地的mp3文件,然后写入到当前路径下的test.mp3
//引入fs模块
let fs = require('fs');
//创建一个读取流
var rs = fs.createReadStream('D:/Program Files/腾讯游戏/英雄联盟/TCLS/music/sound.mp3')
//创建一个写入流
var ws = fs.createWriteStream('test.mp3')
//监听open读取流打开的事件
rs.once('open', ()=>{
console.log('读取stream打开了')
})
//监听读取流关闭的事件
rs.once('close', ()=>{
console.log('duqu读取stream 关闭了了')
})
//监听写入流打开的事件
ws.once('open', ()=>{
console.log('写入stream打开了')
})
//监听写入流关闭的事件
ws.once('close', ()=>{
console.log('写入stream 关闭了了')
})
//第一个data是读取流的data事件,后面的data是读取流读到的信息
rs.on('data',(data)=>{
console.log(data)
ws.write(data) //将读取来的data数据写入到写入流中
})
还有一种方法,是对上面读写流的一种封装,rs有个方法叫pipe();运行效果与上面相同,我们可以读写一个mp4文件,详见代码:
// 引入模块
let fs = require('fs');
// 创建读入流
var rs = fs.createReadStream('C:\\Users\\admin\\Desktop\\img\\test.mp4');
var ws = fs.createWriteStream('liu.mp4');
// 创建管道 ,直接把ws放进去,就会看到文件夹出现了一个mp4
rs.pipe(ws);