1.文件处理的作用
在前端工程中,我们使用了一些脚手架工具,当我们编写例如Vue/Angular等代码时最终放到浏览器执行的是编译过后的代码,也就是这些语法需要经过NodeJS的处理,而这个处理的过程最基本的两样功能便是文件的读取,写入。当我们更了解读取和写入的过程时,我们也就更能理解我们的工程目录的含义。
2.Buffer
2.1 在介绍读取之前我们先介绍一下NodeJS的Buffer,这部分内容可迅速浏览
- 缓冲区Buffer是暂时存放输入输出数据的一段内存
- JS语言没有二进制数据类型,而在处理TCP和文件流的时候,必须二进制数据。
- NodeJS提供了一个Buffer对象来提供对二进制数据的操作
- Buffer是一个表示固定内存分配的全局对象,也就是说要放到缓存区中的字节数需要提前确定
- Buffer好比由一个8位字节元素组成的数组,可以有效的在JavaScript中表示二进制数据
字节(Byte)是计算机存储时的一种计量单位,一个字节等于8位二进制数,一个位就代表一个0或1,每8个位(bit)组成一个字节(Byte), 字节是通过网络传输信息的单位,一个字节最大值十进制数是255(2**8-1) 。
1024字节(b)=1千字节(kb)
1024千字节(kb)=1兆字节(mb)
1024兆字节(mb)=1千兆字节(gb)
我想我们应该已经可以算出你的3G流量套餐可以发送多少字节了,或者说可以发出多少个二进制数,0和1了。更粗犷一点,我们可以暂时把Buffer理解成一种数据类型声明,就像
var a = new Array()
2.2 定义Buffer 通过长度定义Buffer
// 创建一个长度为 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);
<Buffer 00 00 00 00 00 00 00 00 00 00>
// 创建一个长度为 10、且用 0x1 填充的 Buffer。
const buf2 = Buffer.alloc(10, 1);
<Buffer 01 01 01 01 01 01 01 01 01 01>
// 创建一个长度为 10、且未初始化的
Buffer,系统会随机分配内存,可能该内存已经被使用过,带有值。
const buf3 = Buffer.allocUnsafe(10);
<Buffer 98 a2 00 03 01 00 00 00 05 00>
通过数组定义Buffer
// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);
<Buffer 01 02 03>
正常情况下值在0-255之间;
通过字符串定义Buffer
const buf5 = Buffer.from('Hello World!');
<Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64 21>
2.3 Buffer常用方法
- buffer.fill(value[, offset[, end]][, encoding])
手动初始化,清空内存,将buffer内容清0
buffer.fill(0);
<Buffer 00 00 00 00 00 00 00 00 00 00>
- buffer.write(string[, offset[, length]][, encoding])
write方法,给buffer赋值string类型,
buffer.write('佩',0,3,'utf8');
// utf8 一个汉字占三个字节
<Buffer e4 bd a9 00 00 00 00 00 00 00>
buffer.write('子',3,3,'utf8');
<Buffer e4 bd a9 e5 ad 90 00 00 00 00>
//佩子
- buffer.writeInt8(string[, offset[, length]][, encoding])
writeInt8方法给buffer一个字节赋值
var buf = new Buffer(4);
buf.writeInt8(0,0); //16 * 0
buf.writeInt8(16,1); //16 * 1
buf.writeInt8(32,2); //16 * 2
buf.writeInt8(48,3); //16 * 3
console.log(buf);
<Buffer 00 10 20 30>
//用16进制展示值
- buffer.toString([encoding[, start[, end]]])
将buffer读取为String
const buffer = Buffer.from('hello World!');
console.log(buffer);
<Buffer 68 65 6c 6c 6f 20 57 6f 72 6c 64 21>
console.log(buffer.toString('utf8',6,11));
World
- buffer.slice([start[, end]])
buffer截取
const buffer = Buffer.from('hello World!'); const newBuf = buffer.slice(0,5); console.log(newBuf);
<Buffer 68 65 6c 6c 6f>
- buffer.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
复制Buffer,可以把多个buffer拷贝到一个大buffer上
const buffer1 = Buffer.from('hello World!');
const buffer2 = Buffer.alloc(10, 1);
buffer1.copy(buffer2,0,0,6); // 将buffer1里的值拷贝到buffer2中
console.log(buffer1);
console.log(buffer2);
<Buffer 68 65 6c 6c 6f 20 57 6f 72 6c 64 21>
<Buffer 68 65 6c 6c 6f 20 01 01 01 01>
- Buffer.concat(list[, totalLength])
连接buffer,把多个buffer连接成一个新的buffer
const buffer1 = Buffer.from('hello');
const buffer2 = Buffer.from('World');
const buffer3 = Buffer.concat([buffer1,buffer2],10);
console.log(buffer3);
<Buffer 68 65 6c 6c 6f 57 6f 72 6c 64>
- Buffer.isBuffer
判断是否是buffer
const buffer1 = Buffer.from('hello');
const buffer2 = 'World';
console.log(Buffer.isBuffer(buffer1));
console.log(Buffer.isBuffer(buffer2));
true false
- Buffer.length
获取buffer的长度,两种写法都可
const buffer1 = Buffer.from('hello');
console.log(Buffer.byteLength(buffer1));
console.log(buffer1.length);
5
5
下一节我们将学习fs是如何与buffer一起来读写文件的