Node.js
node
基本概念
Node.js是什么
Node.js是一个开源的,跨平台的JavaScript运行环境
Node.js的作用
- 开发服务器应用
- 开发工具类应用
- 开发桌面端应用
Node.js中的JavaScript

Buffer(缓冲器)
概念
Buffer 是一个类似于数组的 对象 ,用于表示固定长度的字节序列
Buffer 本质是一段内存空间,专门用来处理 二进制数据 。

特点
- Buffer 大小固定且无法调整
- Buffer 性能较好,可以直接对计算机内存进行操作
- 每个元素的大小为 1 字节(byte)
使用
创建 Buffer
Node.js 中创建 Buffer 的方式主要如下几种:
Buffer.alloc1
2// 创建了一个长度为 10 字节的 Buffer,相当于申请了 10 字节的内存空间,每个字节的值为 0
let buf_1 = Buffer.alloc(10) //=>结果为<Buffer 00 00 00 00 00 00 00 00 00 00>Buffer.allocUnsafe1
2// 创建了一个长度为 10 字节的 Buffer,buffer 中可能存在旧数据,可能会影响执行结果,所以叫 unsafe ,但是效率比 alloc 高
let buf_2 = Buffer.allocUnsafe(10)Buffer.from1
2
3
4// 通过字符串创建 Buffer
let buf_3 = Buffer.from('hello')
// 通过数组创建 Buffer
let buf_4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117])
Buffer 与字符串的转化
我们可以借助
toString方法将 Buffer 转为字符串
1 | let buf_4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]) |
**注意: **toString 默认是按照 utf-8 编码方式进行转换的
Buffer 的读写
Buffer 可以直接通过
[]的方式对数据进行处理。
1 | let buf_3 = Buffer.from('hello') |
注意:
- 如果修改的数值超过
255,则超过8位数据会被舍弃 - 一个
utf-8的字符 一般 占3个字节
fs 模块
fs 全称为
file system,称之为文件系统,是 Node.js 中的内置模块,可以对计算机中的磁盘进行操作。
本章节会介绍如下几个操作:
文件写入
文件读取
文件移动与重命名
文件删除
文件夹操作
查看资源状态
文件写入
文件写入就是将 数据 保存到 文件 中,我们可以使用如下几个方法来实现该效果
| 方法 | 说明 |
|---|---|
| writeFile | 异步写入 |
| writeFileSync | 同步写入 |
| appendFile / appendFileSync | 追加写入 |
| createWriteStream | 流式写入 |
writeFile 异步写入
语法: fs.writeFile(file, data[, options], callback)
参数说明:
file 文件名
data 待写入的数据
options 选项设置
(可选)callback 写入回调
返回值: undefined
代码示例:
1 | // require 是 Node.js 环境中的 '全局' 变量,用来导入模块 |
writeFileSync 同步写入
语法: fs.writeFileSync(file, data[, options])
参数与 fs.writeFile 大体一致,只是没有 callback 参数
返回值:undefined
代码示例:
1 | try{ |
Node.js 中的磁盘操作是由其他
线程完成的,结果的处理有两种模式:
- 同步处理 JavaScript 主线程
会等待其线程的执行结果,然后再继续执行主线程的代码,效率较低- 异步处理 JavaScript 主线程
不会等待其线程的执行结果,直接执行后续的主线程代码,效率较好
appendFile / appendFileSync 追加写入
appendFile作用是在文件尾部追加内容,appendFile语法与writeFile语法完全相同
语法:
fs.appendFile(file, data[, options], callback)
fs.appendFileSync(file, data[, options])
返回值:二者都为 undefined
实例代码:
1 | fs.append('./座右铭.txt', '则其善者而从之,其不善者而改之。', err =>{ |
createWriteStream 流式写入
语法:fs.createWriteStream(path[, options])
参数说明:
path文件路径options选项配置(可选)
**返回值: **Object
代码示例:
1 | let ws = fs.createWriteStream('./观书有感.txt') |
程序打开一个文件是需要消耗资源的,流式写入可以减少打开关闭文件的次数。
流式写入方式适用于 大文件写入或者频繁写入的场景,
writeFile适合于 写入频率较低的场景
文件读取
文件读取顾名思义,就是通过程序从文件中取出其中的数据,我们可以使用如下几种方式:
| 方法 | 说明 |
|---|---|
| readFile | 异步读取 |
| readFileSync | 同步读取 |
| createReadStream | 流式读取 |
readFile 异步读取
语法: fs.readFile(path[, options], callback)
参数说明:
path 文件路径
options 选项配置
callback 回调函数
返 回 值 : undefined
代码示例:
1 | // 导入 fs 模块 |
readFileSync 同步读取
语法:fs.readFileSync(path[, options])
参数说明:
path 文件路径
options 选项配置
返 回 值 :string | Buffer
代码示例:
1 | let data = fs.readFileSync('./座右铭.txt') |
createReadStream 流式读取
语法:fs.createReadStream(path[, options])
参数说明:
path 文件路径
options 选项配置(
可选)
返回值:Object
代码示例:
1 | // 创建读取流对象 |
文件移动与重命名
在 Node.js 中,我们可以使用
rename或renameSync来移动或重命名文件或文件夹
语法:
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
参数说明:
oldPath 文件当前的路径
newPath 文件新的路径
callback 操作后的回调
代码示例:
1 | fs.rename('./观书有感.txt', './论语/观书有感.txt', err =>{ |
注: 如果还是移动到当前路径,但是修改了名字,就是重命名了
文件删除
在 Node.js 中,我们可以使用
unlink或unlinkSync来删除文件
语法:
fs.unlink(path, callback)
fs.unlinkSync(path)
参数说明:
path 文件路径
callback 操作后的回调
代码示例:
1 | const fs = require('fs') |
文件夹操作
借助 Node.js 的能力,我们可以对文件夹进行
创建、读取、删除等操作
| 方法 | 说明 |
|---|---|
| mkdir / mkdirSync | 创建文件夹 |
| readdir / readdirSync | 读取文件夹 |
| rmdir / rmdirSync | 删除文件夹 |
mkdir 创建文件夹
在 Node.js 中,我们可以使用
mkdir或mkdirSync来创建文件夹
语法:
fs.mkdir(path[, options], callback)
fs.mkdirSync(path[, options])
参数说明:
path 文件夹路径
options 选项配置(
可选)callback 操作后的回调
示例代码:
1 | // 异步创建文件夹 mk make 制作 dir directory 文件夹 |
readdir 读取文件夹
在 Node.js 中,我们可以使用
readdir或readdirSync来读取文件夹
语法:
fs.readdir(path[, options], callback)
fs.readdirSync(path[, options])
参数说明:
path 文件夹路径
options 选项配置(
可选)callback 操作后的回调
示例代码:
1 | // 异步读取 |
rmdir 删除文件夹
在 Node.js 中,我们可以使用
rmdir或rmdirSync来删除文件夹
语法:
fs.rmdir(path[, options], callback)
fs.redirSync(path[, options])
参数说明:
path 文件夹路径
options 选项配置( 可选 )
callback 操作后的回调
示例代码:
1 | // 异步删除文件夹 rm remove 移除 |
查看资源状态
在 Node.js 中,我们可以使用
stat或statSync来查看资源的详细信息
语法:
fs.stat(path[, options], callback)
fs.statSync(path[, options])
参数说明:
path 文件夹路径
options 选项配置( 可选 )
callback 操作后的回调
示例代码:
1 | // 异步获取状态 |

相对路径问题
fs 模块对资源进行操作时,路径的写法有两种:
相对路径
./座右铭.txt当前目录下的 座右铭.txt座右铭.txt等效于上面的写法../座右铭.txt当前目录的上一级目录中的 座右铭.txt
绝对路径
D:/Program Fileswindows 系统下的绝对路径/user/binLinux 系统下的绝对路径
相对路径中所谓的
当前目录,指的是命名行的工作目录,而并非是文件的所在目录所以当命名行的工作目录与文件所在目录不一致时,会出现一些 Bug
__dirname
__dirname 与 require 类似,都是 Node.js 环境中的 ‘全局’ 变量
__dirname 保存着 当前文件夹所在目录的绝对路径,可以使用 __dirname 与文件名拼接成绝对路径
代码示例:
1 | //=>__dirname + '/data.txt' === 'D:\\Desktop\\Node\\code\\03-fs模块/data.txt' |
使用 fs 模块的时候,尽量使用
__dirname路径转换为绝对路径,这样可以避免相对路径产生的 Bug
练习
编写一个 JS 文件,实现复制文件的功能
1 | /* |
文件重命名
1 | // 1. 导入 fs 模块 |
path模块
path模块提供了操作路径的功能,我们将介绍如下几个较为常用的几个 API:
| API | 说明 |
|---|---|
| path.resolve | 拼接规范的绝对路径 常用 |
| path.sep | 获取操作系统的路径分隔符 |
| path.parse | 解析路径并返回对象 |
| path.basename | 获取路径的基础名称 |
| path.dirname | 获取路径的目录名 |
| path.extname | 获得路径的扩展名 |
代码示例:
1 | // 导入 fs 模块 |
