常用API
- path
- Buffer
- event
- fs
path
// 规范化路径
path.normalize(path)
// 拼接路径
path.join([...paths])
path.join('/foo','bar','baz/asdf','qunx','../.')
//绝对路径
path.resolve([...paths]);
path.resolve('foo','/bar','baz')
/*
返回 :/bar/baz 从右到左第一个绝对路径 文档上的几个例子
常用 path.resolve('./') 获取当前路径的绝对路径
*/
//basename ,extname, dirname
path.basename('bby/365.js')
path.extname('.index') // 返回:''
path.dirname(bby/365/index.html)
//parse, format
path.parse('/home/user/dir/file.txt')
path.format({...}) // 对象 -->路径字符串 ,与path.parse()相反
// sep, delimiter, win32, posix 这些都是属性,不是方法
path.sep --> 片段分隔符
path.delimiter --> 路径分隔符
path.win32
path.posix
_dirname, _filename 总是返回的文件的绝对路径;
process.cwd() 返回执行node命令所在的文件夹;
./ 在 require() 中 相对当前文件所在的文件夹;在其他地方,比如:path.resolve('./') 就和 process.cwd() 一样 是相对node命令所在的文件夹;
Buffer
全局变量,不需要require();
- Buffer 用于处理二进制数据流
- 实例类似整数数组,大小固定
- C++ 代码在 V8 堆外分配物理内存
//实例化 Buffer
Buffer.alloc(5, 'a','base64') //默认字符编码 'utf8'不需要写
Buffer.allocUnsafe()
Buffer.form([1,2,3])
// Buffer 类 静态方法
/*
Buffer.bytelength()
Buffer.isBuffer()
Buffer.concat()
*/
// 实例 的方法
/*
buf.length()
buf.toString()
buf.fill()
buf.equals()
buf.indexOf()
buf.copy()
*/
event
- eventEmitter.on()
- eventEmitter.once()
- eventEmitter.emit()
- eventEmitter.removeListener()
- eventEmitter.removeAllListeners()
const EventEmitter = require('events');
class myEvnet extends EventEmitter{};
const event1 = new myEvent();
// 绑定事件
event1.on('test', () =>{
console.log('testtest')
})
// 触发事件
event1.emit('test')
eventEmitter.emit() 传入多个参数情况
eventEmitter.on()绑定事件,可以多次调用;eventEmitter.once()绑定事件,只能调用一次,监听器会被注销
fs 文件系统
- fs.readFile()
对应同步方法:fs.readFileSync()
4-8 解释了为什么要用异步方法
// 读取文件
const fs = require('fs');
fs.readFile('./index.html', (err, data) =>{
if(err) throw err;
console.log(data.toString())
})
- fs.writeFile()
const fs = require('fs');
fs.writeFile('message.txt','hello nodejs adfa','utf8', (err, data) =>{
if(err) throw err;
console.log(data) // undefined 回调函数只有一个err参数
})
- fs.stat()
// 获取文件信息
const fs = require('fs');
fs.stat('index.html',(err,stats) =>{
if(err){
console.log('文件不存在!')
};
console.log(stats);
console.log(stats.isDirectory())
console.log(stats.isFile())
})
- fs.rename()
const fs = require('fs');
fs.rename('./message.txt','./bby.txt', (err) =>{
if(err) throw err;
console.log('done')
})
- fs.unlink()
// 删除文件
const fs = require('fs');
fs.unlink('bby.txt',(err) =>{
if(err) throw err;
console.log('remove')
})
- fs.readdir()
// 'path' 以当前文件为基准,不是运行时的相对路径
const fs = require('fs');
fs.readdir('../node-test',(err,files) =>{
if(err) throw err;
files.map((file) =>{
console.log(file);
})
})
- fs.mkdir()
// 创建文件夹
const fs = require('fs');
fs.mkdir('./bby',(err)=>{
if(err) throw err;
})
- fs.rmdir()
// 删除文件夹
const fs = require('fs');
fs.rmdir('./bby',(err)=>{
if(err) throw err;
})
- fs.watch()
监视文件变化,用于本地构建
// 监视filename 的变化
const fs = require('fs');
fs.watch('../node-test',(evnetType,filename) =>{
console.log(`事件变化类型:${evnetType}`);
if(filename){
console.log(`变化的文件是:${filename}`)
}else{
console.log('没有提供文件名!');
}
})
- fs.createReadStream()
const fs = require('fs');
const st = fs.createReadStream('message.txt',{start:3});
st.pipe(process.stdout)
- fs.createWriteStream()
const fs = require('fs');
const ws = fs.createWriteStream('bby.txt');
//每 200 ms 写入一个数字
const tid = setInterval(function(){
const num = parseInt(Math.random() * 20);
if(num < 15){
ws.write(num + ' ') // num 要转成 字符串 否则报错
}else{
clearInterval(tid);
ws.end()
}
},200)
// 完成后 ,触发事件
ws.on('finish',()=>{
console.log('done!')
})