1.Node.js是什么?
- Node.js是一个开源的、跨平台的Javascript运行环境。
- 通俗讲,Node.js是一款应用程序、是一个软件,可以运行Javascript。
2.Node.js可以干什么?
- 开发服务器应用
- 开发工具类应用
- 开发桌面端应用
3.下载和安装
- 官网:https://nodejs.org/en
- 中文网:Node.js 中文网
4.命令行常用的操作
- 切换盘符:C: D:
- 切换工作目录:cd . cd ..
- 查看目录文件:dir
- 装逼:dir /s
5.Node.js注意事项
- 不能使用DOM相关的api
- 不能使用BOM相关的api
- 可以使用console和定时器(setTimeout/setInterval)
- 可以通过global(旧版)和globalThis(新版)来访问nodejs中的顶级对象(相当于BOM中的window)
6.Buffer
- 概念:Buffer是一个类似于数组的对象,用于表示固定长度的字节序列;其本质是一段内存空间,专门用来处理二进制数据。
- 特点:Buffer大小固定且无法调整;Buffer性能较好,可以直接对计算机内存(二进制)进行操作;每个元素的大小为1字节(byte)
- 创建:
// 1.Buffer.alloc() const buf_1 = Buffer.alloc(10) console.log(buf_1); // 2.Buffer.allocUnsafe() const buf_2 = Buffer.allocUnsafe(20) console.log(buf_2); // 3.Buffer.from() const buf_3 = Buffer.from([1, 2, 3, 4, 5]) console.log(buf_3); // 输出 <Buffer 00 00 00 00 00 00 00 00 00 00> <Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00> <Buffer 01 02 03 04 05>
7.fs模块(file system)文件系统
- 简介:fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动还有文件内容的读取、写入以及文件夹的相关操作等。
-
文件写入:
- writeFile(异步写入)
// 1.引入fs模块 // import fs from 'fs'; // 报错 const fs = require('fs') /* 2.调用writeFile方法 (异步写入) - 参数: 1. 文件路径 2. 要写入的内容 3. 配置对象 详情见flags参数:https://www.runoob.com/nodejs/nodejs-fs.html 4. 写入完成时的回调 参数:err 失败的信息 */ const poem = ` 望天门山 天门中断楚江开, 碧水东流至此回, 两岸青山相对出, 孤帆一片日边来。 ` fs.writeFile('./望天门山.txt', poem, (err) => { if (err) { return console.log(`写入失败,${err}`); } console.log(`写入成功~`); }) console.log('先打印此句话');
- writeFileSync(同步写入)
// 1.引入fs模块 const fs = require('fs') /* 2.调用writeFileSync方法 - 参数 1.文件路径 2.要写入的内容 3.配置对象 */ const poem = ` 望庐山瀑布 朝辞白帝彩云间, 千里江陵一日还, 两岸猿声蹄不住, 轻舟已过万重山。 ` fs.writeFileSync('./望庐山瀑布.txt', poem)
- appendFile(异步追加内容)
// 1.引入fs模块 const fs = require('fs') /** * 2.调用appendFile方法 * - 参数 * 1. 文件路径 (如果文件路径不存在则是创建, 如果存在就是追加内容) * 2. 追加的内容 * 3. 配置对象 * 4. 追加完成的回调 */ fs.appendFile('./嗨嗨.txt', '测试', err => { if (err) { return console.log(`追加失败${err}`); } console.log('追加成功~'); }) fs.appendFile('./望庐山瀑布.txt', '\r\n这首诗写的真不错', err => { if (err) { return console.log(`追加失败${err}`); } console.log('追加成功~'); })
- appendFileSync(同步追加内容)
// 1.引入fs模块 const fs = require('fs') /** * 2.调用appendFileSync方法 * - 参数 * 1.文件路径 (存在就是追加,不存在就是创建) * 2.追加的内容 * 3.配置对象 */ fs.appendFileSync('./望天门山.txt', '这首诗真不错~')
-
使用writeFileSync追加内容
// 1.引入fs模块 const fs = require('fs') // 2.调用writeFileSync方法 参数跟之前一样 这次要传入配置对象 // 详情见flags参数:https://www.runoob.com/nodejs/nodejs-fs.html fs.writeFileSync('./嗨嗨.txt', '\r\n测试二', { flag: 'a' })
-
stream(流式写入)
// 1.引入fs模块 const fs = require('fs') /** * 2.创建通道,调用createWriteStream方法 * 参数: 文件路径 */ const ws = fs.createWriteStream('流式写入.txt') // 3.写入内容 ws.write('我是流式写入的第一段内容,') ws.write('\r\n我是流式写入的第二段内容,') ws.write('\r\n我是流式写入的第三段内容,') // 4.关闭通道 ws.close()
-
文件写入的场景
/* 文件写入在计算机中是一种非常常见的操作,下面的场景都用到了文件写入 1. 下载软件 2. 安装软件 3. 保存程序日志, 如git 4. 编辑器保存文件 5. 视频录制 当需要持久化保存数据的时候, 应该想到文件写入 */
-
文件读取
-
readFile(异步读取)
// 1.引入fs模块 const fs = require('fs') /** * 2.调用readFile方法 * - 参数 * 1.文件路径 * 2.读取完成的回调 * 参数一:err 读取失败的信息 * 参数二:data 读取成功的内容 返回的是一个Buffer 需调用toString()方法将其转换为utf-8的字符集 * */ fs.readFile('./望天门山.txt', (err, data) => { if (err) { return console.log(`读取失败~${err}`); } console.log('读取成功~', data); // console.log(`读取成功~${data}`); 放在模板字符串中会隐式的调用其toString()方法 console.log(data.toString()); })
-
readFileSync(同步读取)
// 1.引入fs模块 const fs = require('fs') /** * 2.调用readFileSync方法 * - 参数: * 1. 文件路径 * 2. 配置对象 * * */ const data = fs.readFileSync('./望天门山.txt') console.log(data); // 返回值是一个Buffer console.log(data.toString()); // 调用toString方法将其转换为utf-8的字符集
-
stream(流式读取)
// 1.引入fs模块 const fs = require('fs') // 2.创建通道 // 这个文件太小 不足以演示 // const rs = fs.createReadStream('./望天门山.txt') const rs = fs.createReadStream('./测试.mp4') // 3.绑定data事件 rs.on('data', chunk => { // console.log(chunk); console.log(chunk.length); // console.log(chunk.toString()); }) // 4.读取完成关闭通道 rs.on('end', () => { console.log('读取完成~'); })
文件读取应用场景
-
/* 读取文件应用场景 1.电脑开机 2.程序运行 3.编辑器打开文件 4.查看图片 5.播放视频 6.播放音乐 7.git log 查看git日志 8.上传文件 9.查看聊天记录 ... */
-
文件复制 (先读后写)
// 方式一 使用readFile和writeFile (先读后写) // 引入fs const fs = require('fs') // 读取 const data = fs.readFileSync('./测试.mp4') // 写入 fs.writeFileSync('./测试2.mp4', data) // 方式二 通过流式读取和流式写入 // 读取 const rs = fs.createReadStream('./测试.mp4') // 写入 const ws = fs.createWriteStream('./测试3.mp4') rs.on('data', chunk => { ws.write(chunk) })
-
文件重命名与移动(rename)
// 1.引入fs模块 const fs = require('fs') /** * 2.调用rename方法 * - 参数 * 1.需要重命名的文件路径 * 2.重命名后的文件路径 (同一目录就是重命名,不同目录就是移动) * 3.重命名或移动完成时的回调 */ // 重命名 fs.rename('./魁拔之书.txt', './魁拔之书_青青树.txt', err => { if (err) { return console.log('操作失败~', err); } console.log('操作成功~'); }) // 移动 fs.rename('./魁拔之书_青青树.txt', '../魁拔之书.txt', err => { if (err) { return console.log('操作失败~', err); } console.log('操作成功~'); }) // 3.rename还有同步方法就是renameSync用法和之前读取写入一样
-
删除文件unlink 和 rm
// 方式一 unlink方法 // 1.引入fs模块 const fs = require('fs') /** * 2.调用unlink方法 * - 参数: * 1.要删除的文件路径 * 2.删除完成时的回调 */ fs.unlink('./哇咔咔.txt', err => { if (err) { return console.log('删除失败~', err); } console.log('删除成功~'); }) // 方式二 调用rm方法 用法跟unlink一样 fs.rm('./哇哈哈.txt', err => { if (err) { return console.log('删除失败~', err); } console.log('删除成功~'); }) // unlink 和 rm都有自己对应的同步方法 unlinkSync 和 rmSync 用法跟之前的一样
-
创建文件夹mkdir 和 mkdirSync
// 1.引入fs模块 const fs = require('fs') /** * 2.调用mkdir方法 * - 参数 * 1.文件路径 * 2.配置对象 * 3.创建完成的回调 * * */ fs.mkdir('./html', err => { if (err) { return console.log('创建失败', err); } console.log('创建成功~') }) // 创建多层级文件夹 (是否递归创建) fs.mkdirSync('./a/b/c', { recursive: true })
-
读取文件夹readdir 和 readdirSync