buffer缓冲区类
为什么使用buffer?
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。原始数据存储在 Buffer 类的实例中。
创建缓存:
const buf=Buffer.from(arrayBuffer[, byteOffset[, length]]); //Buffer.from(string[, encoding])
const buf=Buffer.alloc(); //会被使用零进行初始化
const buf=Buffer.allocUnsafe();//不会被初始化,可能含有敏感信息
(1)创建:from(),alloc(),allocUnsafe()不被初始化,可能包含敏感信息 ,allocUnsafeSlow(),
(2)write(string,offset[,length],encoding)写入,如果空间不够,写入人部分,返回写入代字节数;
(3)toString(encoding,start,end])字符串读取;
(4)toJSON():转json
(5)concat()缓存区合并
(6)copu()拷贝缓冲区
(7)slice()剪切缓冲区
(8)lenght()长度
(9)buf[0]获取buf,获取 Unicode 码,用于标识 buffer 位置中的字符
备注:
Buffer对内存的权限操作相比很大,可以直接捕获一些敏感信息,所以在v6.0以后,官方文档里面建议使用 Buffer.from() 接口去创建Buffer对象。
Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
V8 JavaScript 引擎外部分配的固定大小的内存块(无法调整大小)。
Buffer 与流紧密相连。 当流处理器接收数据的速度快于其消化的速度时,则会将数据放入 buffer 中。
fs文件模块
Node的炒作文件,文件夹模块,同一种方法都有异步,同步;还提供了流传播;
常用方法
1.文件夹操作:
fs.mkdir(./newdi,callback)|fs.mkdirSync(./newdi): 创建文件夹
fs.rmdir(path) | fs.rmdirSync():删除文件夹
fs.rename ( oldpath , newpath, callBack )|fs.renameSync()
fs.readdir(path,callback) | fs.readdirSync():读取文件夹
2.文件操作
增,删,改,查
fs.appendFileSync(path, data, options)|fs.appendfile( path , data , fn):新增文件,生成文件的路径。 如果文件存在则在原有的内容之后追加内容,
fs.unlink( path , callback ):删除文件
fs.rename ( oldpath , newpath, callBack ):修改文件名, 此功能可以修改文件名,剪切文件,修改文件夹名,简介文件夹;
writeFileSync(path,data) | fs.writeFile(path, content, objFlag, callback):只会存入最后一条信息; //flag控制写入模式,
appendFileSync(path,dat)|appendFile(path,dat):在文件后面追加内容;
fs.readFileSync(FileName) | fs.readFile('/Users/joe/test.txt', 'utf8' , (err, data) => {})//读取
r+ 打开文件用于读写。
w+ 打开文件用于读写,将流定位到文件的开头。如果文件不存在则创建文件。
a 打开文件用于写入,将流定位到文件的末尾。如果文件不存在则创建文件。
a+ 打开文件用于读写,将流定位到文件的末尾。如果文件不存在则创建文件。
同步读取文件,都会在返回数据之前将文件的全部内容读取到内存中。会消耗内存;更好的选择是使用流来读取文件的内容。返回代是buffer,需要使用tosting()转化一下
fs常用方法
fs.open(path,'r',(err,fd)=>{}):获取文件,第一个参数为路径,第二个为打开模式,第三个为回掉,fd为文件描述
Fs.write()
Fs.read()
Fs.colse()
fs.stat(path,(err,stats)=>{}):获取文件属性,常用isFile(),isDirectory(),size等
fs.access() 检查文件夹是否存在以及 Node.js 是否具有访问权限。
fs-extra 模块,fs模块的升级;
文件描述符
(1)fs.open('/Users/joe/test.txt', 'r', (err, fd) => { //fd 是文件描述符。})函数第二个入参威描述符,文件描述在回掉函数中返回,
(2)const fd = fs.openSync('/Users/joe/test.txt', 'r'); //fd为返回d文件描述;
一旦获得文件描述符,就可以以任何方式执行所有需要它的操作;怎么添加文件描述,我还没弄明白;
stream(流)
高效的方式处理读/写文件、网络通信、或任何类型的端到端的信息交换。
在传统的方式中,当告诉程序读取文件时,这会将文件从头到尾读入内存,然后进行处理。使用流,则可以逐个片段地读取并处理(而无需全部保存在内存中)。
流的优点
(1)内存效率: 无需加载大量的数据到内存中即可进行处理。
(2)时间效率: 当获得数据之后即可立即开始处理数据,这样所需的时间更少,而不必等到整个数据有效负载可用才开始。
流分为四类:
(1)Readable: 可以通过管道读取、但不能通过管道写入的流 当推送数据到可读流中时,会对其进行缓冲,直到使用者开始读取数据为止。
(2)Writable: 可以通过管道写入、但不能通过管道读取的流。
(3)Duplex: 可以通过管道写入和读取的流,基本上相对于是可读流和可写流的组合。
(4)Transform: 类似于双工流、但其输出是其输入的转换的转换流。
stream常用事件:data-数据,end-读取完毕,error-错误是触发,finish-写入完毕;
(5)管道流pipe;是流的一个方法,快速实现文件读取;
(6)链式流,是通过管道流建立的链式调用;