第二章:前端视角——NodeJS文件操作fs(1)

266 阅读4分钟

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常用方法

  1. buffer.fill(value[, offset[, end]][, encoding])
    手动初始化,清空内存,将buffer内容清0

buffer.fill(0);
<Buffer 00 00 00 00 00 00 00 00 00 00>

  1. 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>
//佩子

  1. 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进制展示值

  1. 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

  1. 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>

  1. 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>

  1. 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>

  1. Buffer.isBuffer
    判断是否是buffer

const buffer1 = Buffer.from('hello');
const buffer2 = 'World';
console.log(Buffer.isBuffer(buffer1));
console.log(Buffer.isBuffer(buffer2));
true false

  1. Buffer.length
    获取buffer的长度,两种写法都可

const buffer1 = Buffer.from('hello');
console.log(Buffer.byteLength(buffer1));
console.log(buffer1.length);
5
5

下一节我们将学习fs是如何与buffer一起来读写文件的