本文主要介绍一下几个模块的API:
文件操作fs path、Buffer缓冲区、Stream文件流、promise与then、querystring及字符串扩展
Node - API模块的种类
在Node.js中,模块分为两类:
第一类,核心模块(原生模块),node自带,用名称直接可以加载:require('fs')
- 核心模块
文件操作相关模块:
fs(file system) 文件操作
path 路径字符串操作
readline 按行读取文本文件
Buffer 缓冲区
Stream 流
+ http:网络模块
+ querystring
+ url
...
第二类,文件模块,用路径加载,有一种特殊的文件模块-包,可以用名字。require('../xx.js')
https://nodejs.org/dist/latest-v6.x/docs/api/ nodejs API文档
一、fs模块
fs模块是node非常重要的模块,能体现出node的优势
- fs模块对文件的几乎所有操作都有同步和异步两种形式
例如:readFile()和readFileSync() - 分别是同步文件系统调用、异步文件系统调用
- 同步与异步文件系统调用的区别
- 异步调用需要回调函数作为额外的参数,通常包含一个错误作为回调函数的第一个参数
- 异步调用通过判断第一个err对象处理异常,同步必须使用try/catch
- 同步调用立即执行,会阻塞当前线程
- 异步调用会进入事件队列,不阻塞后续代码的继续执行,实际的调用直到它被事件循环线程提取出才会执行
文件写入
fs.writeFile(file,data[,option],callback(err))
fs.writeFileSync(file,data,[,option])
文件追加内容
fs.appendFile(file,data[,options],callback(err))
fs.appendFileSync(file,data[,options])
文件读取内容
fs.readFile(file[,options],callback(err,data))
fs.readFileSync(file,[,option])
验证路径是否存在
fs.access(path,callback(access))
fs.accessSync(path) // => 返回布尔类型
获取文件信息
fs.stat(path,callback(err,stats))
fs.statSync(path) // => 返回一个fs.Stats实例
stats.isFile() 如果是文件,返回true
isDirectory() 如果是目录,返回true
isSymbolicLink:用于判断被查看的文件是否为一个符号链接文件,如果是的话则返回true,否则,返回false。该方法仅在lstat方法的回调函数中有效;
size 文件字节数
atime 文件上次访问时间
mtime 文件最后修改时间
ctime 文件创建时间
删除文件
fs.unlink(path,callback(err))
fs.unlinkSync(path)
重命名文件或目录
fs.rename(oldPath,newPath,callback)
fs.renameSync(oldPath,newPath)
移动文件
fs.rename(oldPath)
创建一个目录
fs.mkdir(path[,model],callback)
fs.mkdirSync(path[,model])
删除一个空目录
fs.rmdir(path,callback)
fs.rmdirSync(path)
读取一个目录
fs.readdir(path,callback(err,files))
fs.readdirSync(path) // => 返回files
监视文件变化:
fs.watchFile(filename[, options], listener(curr,prev))
options:{persistent,interval}
fs.watch(filename[,options][,listener])
重点说明一下这两个常用API:
fs.readFile(file, [options], callback) 读文件
//file 读文件的路径
//options 用[]包裹的可选参数,object {"encoding":"uft8","flag":"r"} string 'utf8'
//callback function callback函数里面有两个参数
//err表示错误对象,如果readFile发生错误了,在callback函数里面会回返回err,err对象里面存着错误信息
//如何读文件成功,err为null
//data就是读文件,读出来的内容。
- fs.access(path,[mode], callback) 用来判断文件是否存在
//path 判断路径是否正确(也可以判断文件)'./pic'
//mode一般不用,默认就可以了,用的话是用来判断文件是否可读可写可执行
//callback 只有一个参数err,错,文件有问题
其它
- 第三方库:fs-extra
- vsc教程http://i5ting.github.io/vsc/
二、Path模块
path:处理路径相关字符串
basename(p[,ext]) 注意第二个参数用法 获取文件名
dirname(p) 获取文件目录
extname(p) 获取文件扩展名
format(pathObject) 和 parse(pathString)
isAbsolute(path) 判断是否是绝对路径
join([path1][,path2][,...]) 拼接路径字符串
normalize(p) 将非标准路径转换为标准路径
sep 获取操作系统的文件路径分隔符
path.join("/a","/b",,,,,) 将多个参数连成一个Path
三、buffer(缓冲区)模块
- JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
- 但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区,
缓冲区就是内存中操作数据的容器,只是数据容器而已
。 - 在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。
通过缓冲区可以很方便的操作二进制数据,而在大文件操作时必须要有缓冲区
创建Buffer
在v6.0之前创建Buffer对象直接使用new Buffer()构造函数来创建对象实例,但是Buffer对内存的权限操作相比很大,可以直接捕获一些敏感信息,所以在v6.0以后,官方文档里面建议使用 Buffer.from() 接口去创建Buffer对象。
Buffer 是一个像 Array 的对象,它的元素为16进制的两位数(0-255的值),主要用于操作字节,
Buffer 是一个全局对象,使用的时候不需要 require
const buf = Buffer.from('runoob', 'ascii');
// 输出 72756e6f6f62
console.log(buf.toString('hex'));
// 输出 cnVub29i
console.log(buf.toString('base64'));
Buffer的一些属性和方法
- buf[index] 通过下标访问 buffer 的某个字节的数据
- buf.indexOf(value,[byteOffset],[encoding]) 查找某个字符在 buffer 内存中的字节下标
- buf.includes(value,[byteOffset],[encoding])
- buf.length // 长度
- buf.toString([encoding],[start], [end]) // 从Node缓冲区读取数据
- buf.write(string,[offset],[length],[encoding]) // 写入缓冲区
- buf.toJSON() // 将 Node Buffer 转换为 JSON 对象
Buffer.concat(list[, totalLength]) // Node 缓冲区合并
- buf.compare(otherBuffer); // 缓存区比较
- buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]]) // 拷贝
- buf.slice([start,[end]]) // 剪切
四. Stream文件流
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream对象,还有stdout(标准输出)。
fs.readFile()和fs.writeFile()问题?
对大文件的处理,例如下载
通过文件流的形式传输大文件
const rs = fs.createReadStream(path1);
const ws = fs.createWriteStream(path1);
rs.pipe(ws);
如何去控制流。
我们可以通过监听stream对象里面的事件,去控制读写流。
五、异步链式中的promise与then
then传递的是promise对象,了解即可,then不要求会用,会使用以前的嵌套模式即可
then()方法的两个function参数,对应promise函数的两个参数: resolve,reject成功与失败
//代码演示
var rf = function(){
return new Promise(function(resolve, reject){
fs.readFile('./00.js', 'utf8', (err,data) => {
if(err){
reject(err);
}else {
resolve(data);
}
})
})
}
rf().then(funciton(data){},function(err){})
六、querystring以及字符串的一些扩展
querystring从字面上的意思就是查询字符串,一般是对http请求所带的数据进行解析。querystring模块只提供4个方法,互相对应的。
const querystring = require("querystring");
1. parse这个方法是将一个字符串反序列化为一个对象
querystring.parse(str,separator,eq,options)
2. stringify这个方法是将一个对象序列化成一个字符串,与querystring.parse相对
querystring.stringify(obj,separator,eq,options)
3. escape可使传入的字符串进行URL编码
querystring.escape(str)
4. unescape对字符串进行解码
querystring.unescape(str)
字符串扩展
includes(str)
startsWith(str)
endsWith(str)
repeat(num)
`${变量名}`
模板字符串,使用反引号 (` `) 来代替普通字符串中的用双引号和单引号。模板字符串可以包含特定语法(${expression})的占位符
网友评论