fs(文件系统) 模块
fs 模块提供了一个 API,用于以模仿标准 POSIX 函数的方式与文件系统进行交互。
所有文件系统操作都具有同步和异步的形式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 读取文件; const fs = require('fs');
fs.readFile('./index.txt', 'utf8', (err, data) => { console.log(data); });
const data = fs.readFileSync('./index.txt', 'utf8');
console.log(data);
const stream = fs.createReadStream('./index.txt', 'utf8');
stream.on('data', data => { console.log(data); });
|
写入/修改文件
写入文件时,如果文件不存在,则会创建并写入,如果文件存在,会覆盖文件内容.
1 2 3 4 5 6 7 8 9 10 11
| const fs = require('fs');
fs.writeFile('./write.txt', 'Hello Nodejs', 'utf8', err => { if (err) throw err; });
fs.writeFileSync('./writeSync.txt', 'Hello Nodejs');
const ws = fs.createWriteStream('./writeStream.txt', 'utf8'); ws.write('Hello Nodejs'); ws.end();
|
删除文件/文件夹
删除文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| fs.unlink('./delete.txt', err => { if (err) throw err; });
fs.unlinkSync('./deleteSync.txt'); 删除文件夹;
fs.rmdir('./rmdir', err => { if (err) throw err; });
fs.rmdirSync('./rmdirSync'); 创建文件夹;
fs.mkdir('./mkdir', err => { if (err) throw err; });
fs.mkdirSync('./mkdirSync'); 重命名文件 / 文件夹; const fs = require('fs');
fs.rename('./rename.txt', './rename-r.txt', err => { if (err) throw err; });
fs.renameSync('./renameSync', './renameSync-r'); 复制文件 / 文件夹; const fs = require('fs');
fs.copyFile('./copy.txt', './copy-c.txt', (err, copyFiles) => { if (err) throw err; });
fs.copyFileSync('./null', 'null-c'); 文件夹状态 - 文件 / 文件夹; const fs = require('fs');
fs.stat('./dir', (err, stats) => { if (err) throw err; console.log(stats.isFile()); console.log(stats.isDirectory()); });
const stats = fs.statSync('./stats.txt');
console.log(stats.isFile());
console.log(stats.isDirectory());
|
events 模块
Node 是基于事件驱动的,其就是通过核心模块 Events 实现的。 Events 模块定义了 EventEmitter 类。实际上就是发布订阅模式。所有可能触发事件的对象都是继承自 EventEmitter 类的,其主要包含下面方法:
- addEventListener
- on
- once
- removeListener
- removeAllListeners
- setMaxListeners
- emit
使用 EventEmitter
其他类需要触发事件等,都需要自行继承这个类:
1 2 3 4 5 6 7 8 9 10 11 12 13
| let util = require('util') let EventEmitter = require('events')
function OtherClass(path) { EventEmitter.call(this) } util.inherits(OtherClass, EventEmitter) newListener 事件 EventEmitter 实例还可以监听一个 newListener 事件,即每次给这个实例添加新的监听函数时,都会触发 newListener 事件。
this.on('newListener', function (type, listener) { })
|
stream 模块
流(stream)是 Node.js 中处理流式数据的抽象接口。 stream 模块用于构建实现了流接口的对象。
使用 stream 的场景:
使用 fs.readFile 读取文件时会将数据整个读取到内存中再处理,当处理大文件时,会极大的展示资源,这时就是使用 stream 的时候了。
Stream 不会一次性的读取文件,而是分批次的读取适量的内容到缓存区进行操作,这样对内存的占用会少很多。
流的四种基本类型
Writable - 可写入数据的流(例如 fs.createWriteStream())。
Readable - 可读取数据的流(例如 fs.createReadStream())。
Duplex - 可读又可写的流(例如 net.Socket)。
Transform - 在读写过程中可以修改或转换数据的 Duplex 流(例如 zlib.createDeflate())。
缓冲
缓冲区有大小限制,由 highWaterMark 指定字节总数(对象模式下指定对象总数)。调用 stream.push(chunk)时,数据缓冲在可读流中,等待被消费,如果缓冲区的数据大小达到了 highWaterMark 指定的阈值,流会停止读取数据,直到当前缓冲区的数据被消费。
用于消费的 api
使用继承自 events 的 emitter api 来通讯状态。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| const file = fs.createReadStream('./test.txt', { highWaterMark: 2, flags: 'r', encoding: 'utf8', });
file.on('open', a => { console.log('open', a); });
file.on('data', chunk => { console.log('data', chunk); });
file.on('end', chunk => { console.log('end', chunk); });
file.on('close', a => { console.log('close', a); });
|
(异步)事件触发顺序 open -> data -> data -> … -> end -> close
URL 模块
url 模块用于处理与解析 URL。
URL 字符串是结构化的字符串,包含多个含义不同的组成部分。 解析字符串后返回的 URL 对象,每个属性对应字符串的各个组成部分。
url 模块提供两种 api 来处理 url。(两种 api 的处理结果不同,详细)
const url = require(‘url’)
// WHATWG 标准
const myUrl = new url(‘https://baidu.com:8080/a/b/c?q=str#hash')
// 遗留 api
const myUrl2 = url.parse(‘https://baidu.com:8080/a/b/c?q=str#hash')
以下介绍的都是 WHATWG 标准解析出的对象
URL 对象的属性
const url = require(“url”);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const url = require("url");
const myURL = new url("https://github.com/webfansplz#hello"); console.log(myURL); { href: 'https://github.com/webfansplz#hello', origin: 'https://github.com', protocol: 'https:', username: '', password: '', host: 'github.com', hostname: 'github.com', port: '', pathname: '/webfansplz', search: '', searchParams: URLSearchParams {}, hash: '#hello' }
|
URL 对象属性 除了 origin 和 searchParams 是只读的,其他都是可写的.
- 序列化 URL
1 2 3 4 5 6 7 8 9
| const { URL } = require('url');
const myURL = new URL('https://github.com/webfansplz#hello');
console.log(myURL.href);
console.log(myURL.toString());
console.log(myURL.toJSON());
|