1、path.normalize()
方法会规范化给定的 path
。
2、path.join()
方法使用平台特定的分隔符把全部给定的 path
片段连接到一起,并规范化生成的路径。
3、path.resolve()
方法会把一个路径或路径片段的序列解析为一个绝对路径。
4、path.dirname()
方法返回一个 path
的目录名。
5、path.basename()
方法返回一个 path
的最后一部分。
6、path.extname()
方法返回 path
的扩展名。
7、path.parse()
方法返回一个对象,对象的属性表示 path
的元素。
8、path.format()
方法会从一个对象返回一个路径字符串。
(1)buffer是用于处理二进制数据流的,是个全局变量
(2)buffer实例类似整数数组,大小固定
(3)C++代码在V8堆外分配物理内存
2、几个buffer创建实例
// 创建一个长度为 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);
结果就是
// 创建一个长度为 10、且用 0x1 填充的 Buffer。
const buf2 = Buffer.alloc(10, 1);
结果就是
// 创建一个长度为 10、且未初始化的 Buffer。
// 这个方法比调用 Buffer.alloc() 更快,
// 但返回的 Buffer 实例可能包含旧数据,
// 因此需要使用 fill() 或 write() 重写。
const buf3 = Buffer.allocUnsafe(10);
结果是随机的十个数
// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);
结果就是
// 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
const buf5 = Buffer.from('tést');
结果就是
如果是字符串的方式,后面还能跟第二个参数,可以是base64等,默认是UTF-8。
3、Buffer中常用类的几个API
(1)Buffer.bytelength返回一个字符串的实际字节长度
console.log(Buffer.byteLength('test'))
console.log(Buffer.byteLength('哈哈'))
结果是4 6,那么意思即一个字母是1个字节,一个汉字是3个字节。
(2)Buffer.isBuffer(obj)判断一个对象是不是Buffer对象,是返回true,否返回false
(3)Buffer.concat(list[,totallength])返回一个一刀999级合并了list中所有Buffer实例的新建的Buffer 。
4、Buffer中常用的实例的方法
(1)buf.length:buf对象的长度
(2)buf.toString():buf对象转化为字符串
(3)buf.fill():填充内容,比如buf.fill(10,2,6)意思即从第2个数到第6个数之间填充10,即3、4、5、6这四个数被填10,十六进制来表示就是0a
(4)buf.equals():比较两个buf的内容是否一样,比如buf1.equals(buf2)
(5)buf.indexOf(string):寻找匹配的值,返回匹配值所在的位置。
(6)buf.copy():拷贝buf的一个区域的数据到target的一个区域,即便target的内存区域与buf的重叠。比如说
5、中文乱码的问题
但出现中文乱码的时候就使用StringDecoder来解决
const StringDecoder=require('string_decoder')
const decoder=new StringDecoder('utf8');
.....
console.log(decoder.write(b))
const EventEmitter=require('events');
class CustomEvent extends EventEmitter{}
const ce=new CustomEvent()
ce.on('test',(canshu)=>{ //这里可以传多个参数
console.log(canshu)
console.log('this is a test')
});
setInterval(()=>{
ce.emit('test','This is canshu')
},500)
结果就是每间隔0.5秒就打印This is canshu和this is a test
(3)事件的移除(https://blog.csdn.net/weixin_37968345/article/details/80775142)
const fs=require('fs')
fs.readFile('./process.js',(err,data)=>{
if(err)throw err;
console.log(data.toString())
})
上面的结果就是读取文件自己,当然如果没有toString()方法则就是输出的buffer,也可使用fs.readFile()方法的第二个参数,将第二个参数写为‘utf8,文件也能读取到字符串内容。
2、fs.readFiLeSync(同步操作)
const data=fs.readFileSync('./process.js','utf8')
console.log(data)
3、fs.writeFile(file ,data[,options],callback):
异步地写入数据到文件,如果文件已经存在,则覆盖文件。
流(stream)在 Node.js 中是处理流数据的抽象接口。 stream
模块提供了基础的 API 。使用这些 API 可以很容易地来构建实现流接口的对象。
Node.js 提供了多种流对象。 例如 HTTP请求和 process.stdout
都是流的实例。
流可以是可读的、可写的、或是可读写的。 所有的流都是 EventEmitter
的实例。
stream
模块可以通过以下方式引入:
const stream = require('stream');
尽管理解流的工作方式很重要,但是 stream
模块本身主要用于开发者创建新类型的流实例。 对于大多数以消费流对象为主的开发者来说,极少需要直接使用 stream
模块。
const fs=require('fs')
const rs=fs.createReadStream('./process.js')
rs.pipe(process.stdout)
上面的代码创建一个可读流,源头是process.js文件,流输出是终端,对于流的概念很关键,和刚才的fs.readFile并不一样,readFile是一次性读完显示,流是读一点显示一点,就像网页卡的时候都是从上到下一点点的显示。
const fs=require('fs')
const ws=fs.createWriteStream('./text.txt') //向text.txt文件写入
const tid=setInterval(()=>{
const num=parseInt(Math.random()*10);// 随机生成10以内的整数
console.log(num);
if(num<9){
ws.write(num+'') //使用steam,要么write字符串,要么write一个buffer,不能是数字
}else{
ws.end();clearInterval(tid)//关闭定时器
}
},300)
ws.on('finish',()=>{
console.log('done')
})
上面的代码就是使用流的方式就随机小于9的整数写入text文本中