运维开发网

详细介绍了Node.js的缓存和文件操作的基本介绍

运维开发网 https://www.qedev.com 2022-05-25 16:01 出处:网络
Node.js是一个基于Chrome?V8引擎的JavaScript运行时。类似于Java中的JRE,.Net中的CLR。本文将详细为大家介绍Node.js中的缓存区与文件操作,感兴趣的可以了解一下

Node.js是一个基于Chrome?V8引擎的JavaScript运行时。类似于Java中的JRE,.Net中的CLR。本文将详细为大家介绍Node.js中的缓存区与文件操作,感兴趣的可以了解一下

经过前三天的学习,Node.js的基础知识已经逐渐掌握。今天继续学习缓存和文件操作,稍微整理一下分享一下。如有不足之处,请指正。


缓存区


1. 什么是缓存区?

JavaScript本身只有基本数据类型(比如字符串),没有二进制数据类型。二进制数据可以存储计算机中的任何数据(如一段文本、一幅图片等。).Node.js作为服务器,在处理TCP网络流或文件流时,必须使用二进制数据。因此,在Node.js中定义了一个Buffer类来创建一个专用于存储二进制数据的缓冲区。因此,缓存区是在内存中开辟一个临时区域,用于存储要操作的字节码。


2. 创建指定长度的缓存区

Node.js中提供了Buffer对象,可以直接创建指定长度的缓冲区,如下图:

var buffer = Buffer.alloc(10);; buffer.write('abcdefghij'); console.log(buf);

示例输出结果如下:


从上面的例子可以看出,一串书写的英文字符以十六进制格式显示在缓冲区中。

十六位字符的表示,可以参考ASCII((美国信息交换标准码))。

ASCII((美国信息交换标准码):美国信息交换标准码)是一种基于拉丁字母的计算机编码系统,主要用于显示现代英语和其他西欧语言。这是最常见的信息交换标准,相当于国际标准ISO/IEC 646。ASCII于1967年首次发布,最后一次更新是在1986年。到目前为止,已经定义了128个字符[1]。例子如下:


当汉字存储在缓冲区时,也会转换成UTF-8编码的字节码,用十六进制表示,如下所示:

var buffer = Buffer.alloc(10); buffer.write('张三'); console.log(buffer);

例子如下:


从上面的例子可以看出,在Node.js中,采用了UTF-8编码,一个英文字符占用一个字节;1个汉字有3-4个字节(UTF 8编码长度可变)。


3. 通过数组创建缓存区

在Node.js中,通过数组创建一个缓存区域,如下所示:

var buffer = Buffer.from([97,98,99,100,101,102]); console.log(buffer); console.log(buffer.toString());

示例结果如下:


从上面的例子可以看出,数组的格式是十进制整数,存放在缓冲区时,转换成十六进制来表示。


4. 通过字符串创建缓存区

Buffer.from方法,不仅可以通过数组创建,还可以传入字符串内容,如下所示:

var buffer = Buffer.from("我是小六子呀!"); console.log(buffer); console.log(buffer.toString());

结果如下:



5. 读写缓存区

在Node.js中,缓存的内容由toString方法读取,由write方法写入。如下所示:

var buffer = Buffer.alloc(10); buffer.write('张三'); console.log(buffer.toString());

例子如下:



6. 复制缓存区

使用copy方法,可以将一个缓冲区的内容从一个缓冲区复制到一个新的缓冲区。如下所示:

var buffer = Buffer.from("我是小六子呀!"); var buffer2 = Buffer.alloc(21); console.log("复制前",buffer2); buffer.copy(buffer2); console.log("复制后:",buffer2);

结果如下:



文件操作

Node.js作为服务器端程序,增加了读取文件的操作。文件I/O操作是标准POSIX函数的简单封装,通过require(# 39;fs # 39)使用这个模块,所有的方法都有同步和异步的方式。文件的读写方式主要有两种:A,直接读取,B,流式读取。


1. 异步直接读取

在触发回调函数之前,将硬盘上的所有内容读入内存。如下所示:

var fs =require('fs');fs.readFile('./test.txt',function(err,data){ if(err){ console.log(err); }else{ console.log(data.toString());//默认data为Buffer类型 }});

例子如下:



2. 同步直接读取

同步直接返回数据内容,而不使用回调函数,如下所示:

var fs =require('fs'); var data = fs.readFileSync('./test.txt'); console.log(data.toString());


3. 流式读取

当要读取的文件较大,无法一次读取时,就需要通过流的方式从硬盘中逐段读取数据。读取一段循环触发一个回调函数实现大文件操作。

如果现在有一个文件,通过流式读取,如下所示:

var fs =require('fs');//创建流var stream=fs.createReadStream('./test.txt');//监控流获取数据事件stream.on('data',function(data){ console.log('--------------------------'); console.log(data.length); console.log(data);});

阅读的例子如下:


从上面的例子可以看出,每个字节流读取的数据大小是65,536字节,即64KB。如果文件大小大于64KB,将分多个部分读取。


4. 写入文件

写文件与读文件相反,如下所示:

var fs =require('fs');var test="这周都没有上班了,在居家办公,好不方便呀!!!";fs.writeFile('./test1.txt',test,function(err){ if(err){ console.log(err); }else{ console.log('保存成功'); }});

例子如下:


默认文件是utf-8编码,如下所示:


同步写就是在异步写之后加Sync。


5. 流式写入文件

字节按如下方式写入文件:

var fs =require('fs'); var stream = fs.createWriteStream('./input.txt'); stream.write("小六子潇洒呀"); stream.write("小六公子潇洒呀"); stream.write("小六痞子潇洒呀"); stream.end();

成功写入后,文件如下:


请注意,在流式传输文件时,必须有一个end方法来结束字节流。流中还有其他事件,如end、finish和error,可以通过on进行监控。


6. 读取文件信息

Node.js不仅可以读取写入的文件内容,还可以读取文件信息,比如文件大小,创建时间等等,如下图:

var fs =require('fs');fs.stat('./test.txt',function(err,stat){ if(err){ console.log(err); }else{ console.log(stat); }});

读取文件信息会返回一个包含文件所有属性的对象。示例结果如下:


注意:返回的Stat对象包含isFile和isDirectory方法,用于确定路径是文件还是文件夹。


7. 删除文件

unlink方法可用于删除文件,如下所示:

var fs =require('fs');fs.unlink('./test.txt',function(err){ if(err){ console.log(err); }else{ console.log('删除成功'); }});

如果要删除的文件不存在,则返回错误信息;如果是,它将提示删除成功。结果如下:



8. 管道

管道为输出流到输入流提供了一种机制。

通常,我们通过从一个流获取数据并将其传输到另一个流来复制大文件。如下所示:

var fs =require('fs');var s1=fs.createReadStream('./test.txt');var s2 = fs.createWriteStream('./input.txt');//以流的方式实现大文件复制,读取一节,传递一节s1.on('data',function(data){ s2.write(data);});s1.on('end',function(){ s2.end(); console.log('文件复制完成');});

上面的方法有点复杂,流水线方法可以简化操作,如下图:

var fs =require('fs'); var s1=fs.createReadStream('./test.txt'); var s2 = fs.createWriteStream('./input.txt'); s1.pipe(s2);//管道方式


9. 链式流

数据流通过管道连接起来,实现链式管理。比如压缩。

var fs =require('fs'); var zlib =require('zlib'); var s1=fs.createReadStream('./test.txt'); var s2 = fs.createWriteStream('./test.zip'); s1.pipe(zlib.createGzip()).pipe(s2);

关于Node.js基本介绍的缓存和文件操作的详细说明本文到此为止,更多关于Node.js缓存的文件操作,请搜索搜源网之前的文章或者继续浏览下面的相关文章。

0

精彩评论

暂无评论...
验证码 换一张
取 消