Nodejs基础2之fs模块的文件写入、文件读取、fs练习-复制文件

fs模块

  1. fs全称为 file system 文件系统
  2. fs模块可以实现与硬盘的交互
    例如文件的创建、删除、重命名、移动
    还有文件内容的写入、读取,
    以及文件夹的相关操作

文件写入

writeFile文件写入

/*
*   需求:
*   新建一个文件,座右铭.txt,写入内容,三人行,必有我师焉
* */

//1、导入fs模块
const fs=require('fs')

// 2.写入文件
fs.writeFile('./座右铭.txt','三人行,必有我师焉',err=>{
    // err,写入失败:错误对象  写入成功:null
    if(err){
        console.log("写入失败")
        return;
    }
    console.log("写入成功!")
})

请添加图片描述
请添加图片描述

fs异步与同步

同步:
请添加图片描述
异步:
请添加图片描述

writeFile异步执行
const fs=require('fs')

//异步写入
fs.writeFile('./座右铭.txt','师夷长技以制夷',err=>{
    if(err){
        console.log("写入失败!")
    }
    console.log("写入成功!")
})

console.log("你好啊~")

在这里插入图片描述
在这里插入图片描述

writeFileSync同步写入
const fs=require('fs')
//同步写入
fs.writeFileSync('./data.txt','数据在此')

console.log("你好啊")

在这里插入图片描述
在这里插入图片描述

注意:
Node.js 中的磁盘操作是由其他 线程 完成的,结果的处理有两种模式:
同步处理 JavaScript 主线程 会等待 其他线程的执行结果,然后再继续执行主线程的代码,效率较低
异步处理 JavaScript 主线程 不会等待 其他线程的执行结果,直接执行后续的主线程代码,效率较好

fs追加写入

appendFile 异步追加写入
//追加写入
const fs=require('fs')
//  \r\n 换行
fs.appendFile('./座右铭.txt','\r\n三人行,必有我师焉。',err=>{
    if(err){
        console.log("写入失败!")
        return
    }
    console.log('写入成功!')
})

在这里插入图片描述

在这里插入图片描述

appendFileSync 同步追加写入
const fs=require('fs')
fs.appendFileSync('./座右铭.txt','择其善者而从之,其不善者而改之。')

在这里插入图片描述

writeFile 实现追加写入
const fs=require('fs')
fs.writeFile('./座右铭.txt','\r\nover over over',{flag:'a'},err=>{
    if(err){
        console.log("写入失败!")
        return;
    }
    console.log('写入成功!')
})

在这里插入图片描述
在这里插入图片描述

文件流式写入

createWriteStream 流式写入
// 1. 导入fs
const fs=require('fs')

// 2. 创建写入流对象
const ws=fs.createWriteStream('./静夜思.txt')

// 3. write
ws.write('床前明月光,\r\n')
ws.write('疑是地上霜。\r\n')
ws.write('举头望明月,\r\n')
ws.write('低头思故乡。\r\n')

// 4. 关闭通道
ws.close()

在这里插入图片描述

创建流相当于一个人给另一个人打电话的通话时间,写入相当于给别人说话,关闭通道相当于挂断电话

文件写入应用场景

  • 下载文件
  • 安装软件
  • 保存程序日志,如 Git
  • 编辑器保存文件
  • 视频录制

需要持久化保存数据 的时候,应该想到 文件写入

文件读取

readFile 文件读取(异步)

const fs=require('fs')

fs.readFile('./静夜思.txt',(err,data)=>{
    if(err){
        console.log("读取失败!")
        return;
    }
    console.log(data.toString())
})

在这里插入图片描述

readFileSync 同步读取

const fs=require('fs')

let data=fs.readFileSync('./静夜思.txt')

console.log(data.toString());

在这里插入图片描述

读取文件的应用场景

  • 电脑开机
  • 程序运行
  • 编辑器打开文件
  • 查看图片
  • 播放视频
  • 播放音乐
  • Git 查看日志
  • 上传文件
  • 查看聊天记录

fs 流式读取

流式读取:分块读取(分块加载到内存)
readFile:一次性读取
在这里插入图片描述

// 1.引入fs模块
const fs=require('fs')
// 2.创建读取流对象
const rs=fs.createReadStream('./动画1.gif')
// 3. 绑定data事件,chunk是一块
rs.on('data',chunk=>{
    console.log(chunk)  //65536 字节 64KB
    console.log(chunk.length)
})
// 4.end 事件
rs.on('end',()=>{
    console.log('读取完成')
})

在这里插入图片描述

在这里插入图片描述

fs练习-复制文件

文件复制:复制【资料】文件夹下的【动画1.gif】到 【复制文件】文件夹下一份

方法一:用读取写入文件的方式

//方法一:readFile和writeFile
const fs=require('fs')
//读取文件内容
let data=fs.readFileSync('./资料/动画1.gif')
//写入文件
fs.writeFileSync('./资料/复制文件/动画1-1.gif',data)

在这里插入图片描述

方法二:用读写流的方式

//方法二:用读写流的方式
const fs=require('fs')
//创建读取流对象
const rs=fs.createReadStream('./资料/动画1.gif')
//创建写入流对象
const ws=fs.createWriteStream('./资料/复制文件/动画1-2.gif')
//绑定data对象
rs.on('data',chunk=>{
    ws.write(chunk)
})

在这里插入图片描述

两种方式比较

两种方式比价下来,第二种更节约内存资源。
因为第一种是一次性将文件读取到内存,然后再执行之后的工作
第二种是读一块到内存,然后再写一块到文件中
注意的是,实质上读取速度是比写入速度要快的,所以一般是读取几块才会写一块
但是即便如此,也是第二种方式更节约内存资源

使用process.memoryUsage()比较两种资源大小
//比较内存资源
// 方式一
const fs=require('fs')
const process=require('process')
//读取文件
let data=fs.readFileSync('./资料/测试.mp4')
//写入文件
fs.writeFileSync('./资料/复制文件/测试1.mp4',data)
console.log(process.memoryUsage());

请添加图片描述
53108736 => 50MB

//方式二
const fs=require('fs')
const process=require('process')
//创建读取流对象
let rs=fs.createReadStream('./资料/测试.mp4')
//创建写入流对象
let ws=fs.createWriteStream('./资料/复制文件/测试1-2.mp4')
//data 事件
rs.on('data',chunk=>{
    ws.write(chunk)
})
rs.on('end',()=>{
    console.log(process.memoryUsage())
})

在这里插入图片描述
26288128 => 25MB

在这里插入图片描述
对比以上两个方法,得出第二种方法更节约内存资源

读写流方式简写

//简写:
const fs=require('fs')
//const process=require('process')
//创建读取流对象
let rs=fs.createReadStream('./资料/测试.mp4')
//创建写入流对象
let ws=fs.createWriteStream('./资料/复制文件/测试1-3.mp4')
//data 事件
// rs.on('data',chunk=>{
//     ws.write(chunk)
// })
// rs.on('end',()=>{
//     console.log(process.memoryUsage())
// })

//简写
rs.pipe(ws)

在这里插入图片描述

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值