Node.js基础入门之缓存区与文件操作详解

 更新时间:2022年03月21日 15:16:49   作者:小六公子  
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 ((American Standard Code for Information Interchange): 美国信息交换标准代码)。

ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准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个英文字符占1个字节;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('fs')使用该模块,所有方法都有同步和异步的方式。读写文件主要有两种方式: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);
});

读取示例如下所示:

通过以上示例可以看出,每一次字节流读取的数据大小为65536字节,即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. 管道

管道(pipe)提供了一个输出流到输入流的机制。

通常我们复制大文件,采用从一个流中获取数据,并将数据传递到另外一个流中。如下所示:

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缓存区 文件操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解node.js的http模块实例演示

    详解node.js的http模块实例演示

    这篇文章主要介绍了详解node.js的http模块实例演示,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Yarn的安装与使用详细介绍

    Yarn的安装与使用详细介绍

    不知道大家有没有觉察到Facebook近年大招频出。Yarn是Facebook最近发布的一款依赖包安装工具。Yarn是一个新的快速安全可信赖的可以替代NPM的依赖管理工具,Yarn正式发布没几天已经迅速达到了数万赞,就可以知道大家苦NPM久已。这篇文章将详细介绍Yarn的安装与使用。
    2016-10-10
  • Node.js如何响应Ajax的POST请求并且保存为JSON文件详解

    Node.js如何响应Ajax的POST请求并且保存为JSON文件详解

    这篇文章主要介绍了关于Node.js是如何响应Ajax的POST请求并且保存为JSON文件的相关资料,文中介绍的很详细,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • 深入浅析NodeJs并发异步的回调处理

    深入浅析NodeJs并发异步的回调处理

    这篇文章主要介绍了NodeJs并发异步的回调处理的相关资料,需要的朋友可以参考下
    2015-12-12
  • 详解通过源码解析Node.js中cluster模块的主要功能实现

    详解通过源码解析Node.js中cluster模块的主要功能实现

    这篇文章主要介绍了详解通过源码解析Node.js中cluster模块的主要功能实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Nestjs自定义注解实现接口权限控制详解

    Nestjs自定义注解实现接口权限控制详解

    这篇文章主要为大家介绍了Nestjs自定义注解实现接口权限控制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 安装Node.js并创建Web程序

    安装Node.js并创建Web程序

    这篇文章介绍了安装Node.js并创建Web程序的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Node.js中,在cmd界面,进入退出Node.js运行环境的方法

    Node.js中,在cmd界面,进入退出Node.js运行环境的方法

    今天小编就为大家分享一篇Node.js中,在cmd界面,进入退出Node.js运行环境的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • node.js中module模块的功能理解与用法实例分析

    node.js中module模块的功能理解与用法实例分析

    这篇文章主要介绍了node.js中module模块的功能理解与用法,结合实例形式分析了node.js module模块的基本功能、原理、用法及相关操作注意事项,需要的朋友可以参考下
    2020-02-02
  • nodejs更改项目端口号的方法

    nodejs更改项目端口号的方法

    今天小编就为大家分享一篇nodejs更改项目端口号的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05

最新评论