在js文件中引入fs,再打印出来,可以看到fs模块中的诸多方法
const fs = require('fs')
console.log(fs);
{
read: [Function: read],
readSync: [Function: readSync],
readFile: [Function: readFile],
readFileSync: [Function: readFileSync],
readlink: [Function: readlink],
......
ReadStream: [Getter/Setter],
WriteStream: [Getter/Setter]
}
我们在同级创建一个新的文件text.json
,用于fs
对文件的读写。读取文件用到的是readFile
这个方法:
{ userName: '张三' }
const fs = require('fs')
fs.readFile('./text.json', (err, data) => {
if (err) {
console.err('read file err!')
} else {
console.log(data)
}
})
----------------------------
<Buffer 7b 20 75 73 65 72 4e 61 6d 65 3a 20 27 e5 bc a0 e4 b8 89 27 20 7d>
readFile
是异步方法,第一个参数是要读取的文件的路径,第二个参数可以是一个回调函数,当文件读取成功或读取失败时,readFile
都会回调这个函数,根据不同的情况返回不同的内容。如果成功,返回的err
为 null,data
为实际文件内容;否则,err
为一个包含了错误信息的对象。但是在上面我们看到,阅读出来的文档,是一个二进制码,需要将其转换成正常的文本,有两种方法:
- 使用data.toString()
- 在读取文件时候,加一个参数(编码方式)
<!-- 方法1 -->
const fs = require('fs')
fs.readFile('./text.json', (err, data) => {
if (err) {
console.err('read file err!')
} else {
console.log(data.toString('utf-8'))
}
})
<!-- 方法2 -->
const fs = require('fs')
fs.readFile('./text.json', { encoding: 'utf-8' }, (err, data) => {
if (err) {
console.err('read file err!')
} else {
console.log(data.toString('utf-8'))
}
})
readFile
是异步读取文件内容,如果我们读取的文件很大,又不希望阻塞后续的操作,可以使用这个方法。但是如果文件不大,更简单的方式是使用readFileSync
方法。这个方法与readFile
用法相似,却是同步读取文件,不需要异步,使用上会更简单。例如:
const fs = require('fs')
const data = fs.readFileSync('./text.json', { encoding: 'utf-8' })
console.log(data);
fs
模块中有两个方法可以方便地读取出文件内容,一个是readFile
,一个是readFileSync
,前者是异步方法,后者是同步方法,使用起来都不复杂。不过需要注意的是,为了准确读取到文件,我们需要处理好文件的路径,这个可以通过使用url
和path
模块来完成。例如:
import {readFileSync} from 'fs';
import {fileURLToPath} from 'url';
import {dirname, resolve} from 'path';
const url = import.meta.url; // 获取当前脚本文件的url
const path = resolve(dirname(fileURLToPath(url)), 'corpus/data.json');
const data = readFileSync(path, {encoding: 'utf-8'});
console.log(data);
fs
、url
和path
都是 Node.js 比较常用的内置模块包。fs
模块包除了readFile
和readFileSync
外,比较常用的子模块和 API 还有如下这些。
- fs.dir:操作目录的子模块,提供
dir.read
、dir.readSync
等 API 来读取目录信息。 - fs.createReadStream():创建一个读文件流对象。
- fs.createWriteSteam():创建一个写文件流对象。
- fs.stat()、fs.statSync():读取文件信息,包括文件状态、权限、创建时间、修改时间等等信息。
- fs.appendFile()、fs.appendFileSync():追加内容到文件
- fs.chmod()、fs.chown():改变文件权限、权限组。
- fs.copyFile()、fs.copyFileSync():拷贝文件。
- fs.mkdir()、fs.mkdirSync():创建目录。
- fs.rename()、fs.renameSync():修改文件名。
- fs.rmdir()、fs.rmdirSync():删除目录。
- fs.unlink()、fs.unlinkSync():删除文件。
- fs.watchFile():这是用来监听文件内容变化的 API。
- fs.writeFile()、fs.writeFileSync():写入文件。
url
模块主要用来处理 URL 地址,除了我们用到的fileURLToPath
外,它可以通过new URL
创建一个 URL 对象,然后访问这个对象的 protocal、hostname、port、origin、pathname、query、hash 等等属性,拿到 URL 上的各部分信息。path
模块主要用来处理文件路径,除了我们用到的dirname
、resolve
外,还有basename()
、extname()
、join()
、format()
等等方法,可以解析 path 路径的各个部分,以及拼接文件路径或者将对象内容格式化为文件路径。