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

目录
  • 缓存区
    • 1. 什么是缓存区?
    • 2. 创建指定长度的缓存区
    • 3. 通过数组创建缓存区
    • 4. 通过字符串创建缓存区
    • 5. 读写缓存区
    • 6. 复制缓存区
  • 文件操作
    • 1. 异步直接读取
    • 2. 同步直接读取
    • 3. 流式读取
    • 4. 写入文件
    • 5. 流式写入文件
    • 6. 读取文件信息
    • 7. 删除文件
    • 8. 管道
    • 9. 链式流

经过前面三天的学习,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缓存区 文件操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Node.js中常规的文件操作总结

    前言 Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API. Node 导入文件系统模块(fs)语法如下所示: var fs = require("fs") fs模块是文件操作的封装,它提供了文件的读取.写入.更名.删除.遍历目录.链接等POSIX文件系统操作.与其他模块不同的是,fs模块中所有的操作都提供了异步和同步的两个版本,例如读取文件内容的函数有异步的fs.readFile()和同步的fs.readFileSync() . 一. 目录操作 1. 创建目录 创

  • 详解Node.js读写中文内容文件操作

    由于Node.js仅支持如下编码:utf8, ucs2, ascii, binary, base64, hex,并不支持中文GBK或GB2312之类的编码, 因此如果要读写GBK或GB2312格式的文件的中文内容,必须要用额外的模块:iconv-lite 1.安装模块:npm install iconv-lite 2.演示代码,把下面的代码复制到一个文件中,假设是ch.js(注意:js文件必须保存为utf8编码格式): // 加载File System读写模块 var fs = require(

  • Node.js文件操作详解

    Node有一组数据流API,可以像处理网络流那样处理文件,用起来很方便,但是它只允许顺序处理文件,不能随机读写文件.因此,需要使用一些更底层的文件系统操作. 本章覆盖了文件处理的基础知识,包括如何打开文件,读取文件某一部分,写数据,以及关闭文件. Node的很多文件API几乎是UNIX(POSIX)中对应文件API 的翻版,比如使用文件描述符的方式,就像UNIX里一样,文件描述符在Node里也是一个整型数字,代表一个实体在进程文件描述符表里的索引. 有3个特殊的文件描述符--1,2和3.他们分别

  • 从零学习node.js之文件操作(三)

    一.文件操作 在文件操作里,主要是有文件读写,创建.移动文件等. 1.1 读取文件 读取文本文件时,如.txt, .js, .json等文件,直接使用readFile就可以获取文件的内容. // server.js var fs = require('fs'); fs.readFile('./data.txt', 'utf-8', function(err, data){ if(err) throw err; console.log(data); }); 读取图片时,我们是不能直接输出到控制台中

  • Node.js文件操作方法汇总

    Node.js和其他语言一样,也有文件操作.先不说node.js中的文件操作,其他语言的文件操作一般也都是有打开.关闭.读.写.文件信息.新建删除目录.删除文件.检测文件路径等.在node.js中也是一样,也都是这些功能,可能就是api与其他语言不太一样. 一.同步.异步打开关闭 /** * Created by Administrator on 2016/3/21. */ var fs=require("fs"); //同步读 fs.openSync = function(path,

  • Node.js 实现简单的无侵入式缓存框架的方法

    前言 python 的flask.ext.cache 通过注解这样对方法返回结果进行缓存: @cache.cached(timeout=300, key_prefix='view_%s', unless=None) def hello(name=None): print 'view hello called' return render_template('hello.html', name=name) 这类实现方式对业务逻辑没有丝毫的侵入性,非常之优雅. 最近在做 Node.js 地项目,然而

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

    目录 缓存区 1. 什么是缓存区? 2. 创建指定长度的缓存区 3. 通过数组创建缓存区 4. 通过字符串创建缓存区 5. 读写缓存区 6. 复制缓存区 文件操作 1. 异步直接读取 2. 同步直接读取 3. 流式读取 4. 写入文件 5. 流式写入文件 6. 读取文件信息 7. 删除文件 8. 管道 9. 链式流 经过前面三天的学习,Node.js的基础知识已逐渐掌握,今天继续学习缓存区和文件操作,并稍加整理加以分享,如有不足之处,还请指正. 缓存区 1. 什么是缓存区? JavaScript

  • Node.js基础入门之模块与npm包管理器使用详解

    目录 require函数 模块分类 第三方模块 1. 安装第三方模块 2. 引入第三方模块 3. 示例测试 系统模块 require注意事项 exports导出对象 1. exports示例 2. exports注意事项 module模块对象 package.json包描述文件 1. 什么是package.json ? 2. 如何创建package.json文件? NPM基础 1. 常用npm命令 2. npm 示例 cnpm基础 1. 什么是cnpm ? 2. 使用cnpm 控制台输出 1.

  • Node.js基础入门之使用方式及模块化详解

    目录 什么是Node.js ? Node.js下载 Node.js和JavaScript的区别 Node.js安装与验证 Node.js使用方式 1. REPL模式 2. 文件模式 Node.js模块化 1. 什么是模块? 2. 模块分类 3. 创建自定义模块 4. 调用自定义模块 5. 模块测试 6. 主模块 7. 模块组成 在这个竞争日益激烈的今天,已经不是一门语言,一项技术走天下的时代了.正所谓艺多不压身,今天开始学习Node.js,学而时习之,不亦乐乎,希望可以借鉴经验,学以致用,如有不

  • Node.js基础入门之path模块,url模块,http模块使用详解

    目录 path模块 1. path模块示例 2. path模块其他方法 url模块 1. 旧的解析方法 2. 新的解析方法 http模块 1. 什么是HTTP协议? 2. HTTP协议约束的细节 3. HTTP请求响应过程 4. http模块get方法 经过前面四天的学习,对Node.js已经有了一个基础的认识,今天继续学习Node.js网络通信编程相关内容,并稍加整理加以分享,如有不足之处,还请指正. path模块 Node.js中,提供了一个path模块,在这个模块中,提供了许多实用的,可被

  • Node.js基础入门之回调函数及异步与同步详解

    目录 回调函数 1. 什么是回调函数? 2. 回调函数实现机制 3. 回调函数用途 4. 回调函数示例 异步与同步 1. 什么是异步与同步? 2. 同步示例 3. 异步示例一 4. 异步示例二 异步的实现 1. 回调函数的同步示例 2. 异步事件示例 3. 异步示例截图 Promise基础 1. 什么是Promise ? 2. Promise特点 3. 异步的缺点 4. Promise保证异步顺序 经过前面两天的学习,已经对Node.js有了一个初步的认识,今天继续学习其他内容,并加以整理分享,

  • Node.js 中的 fs 模块与Path模块方法详解

    概述: 文件系统模块是一个简单包装的标准 POSIX 文件 I/O 操作方法集.可以通过调用 require("fs") 来获取该模块.文件系统模块中的所有方法均有异步和同步版本. 文件系统模块中的异步方法需要一个完成时的回调函数作为最后一个传入形参. 回调函数的构成由调用的异步方法所决定,通常情况下回调函数的第一个形参为返回的错误信息. 如果异步操作执行正确并返回,该错误形参则为null或者undefined.如果使用的是同步版本的操作方法,一旦出现错误,会以通常的抛出错误的形式返回

  • Node.js高级编程cluster环境及源码调试详解

    目录 前言 准备调试环境 编译 Node.js 准备 IDE 环境 Cluster 源码调试 SharedHandle RoundRobinHandle 为什么端口不冲突 SO_REUSEADDR 补充 SharedHandle 和 RoundRobinHandle 两种模式的对比 前言 日常工作中,对 Node.js 的使用都比较粗浅,趁未羊之际,来学点稍微高级的,那就先从 cluster 开始吧. 尼古拉斯张三说过,“带着问题去学习是一个比较好的方法”,所以我们也来试一试. 当初使用 clu

  • Python 分布式缓存之Reids数据类型操作详解

    1.Redis API 1.安装redis模块 $ pip3.8 install redis 2.使用redis模块 import redis # 连接redis的ip地址/主机名,port,password=None r = redis.Redis(host="127.0.0.1",port=6379,password="gs123456") 3.redis连接池 redis-py使用connection pool来管理对一个redis server的所有连接,避

  • Node.js中的模块化,npm包管理器详解

    目录 模块化的基本概念 什么是模块化 模块化拆分的好处 Node.js中的模块化 Node.js中模块的分类 加载模块 模块作用域 向外共享模块作用域中的成员 module对象 exports对象 npm与包 包 如何下载包 在项目中安装包的命令 解决下包速度慢的问题 为什么下包速度慢 解决方法一--淘宝NPM镜像服务器 解决方法二--切换npm的下包镜像源 解决方法三--nrm 总结 模块化的基本概念 什么是模块化 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程.对于整个

  • 利用Node.js了解与测量HTTP所花费的时间详解

    前言 了解和测量HTTP时间有助于我们发现客户端到服务器或服务器到服务器之间的通信性能瓶颈. 本文介绍了HTTP请求中的时间开销,并展示了如何在Node.js中进行测量. 在我们开始了解HTTP时间开销之前,让我们来看一些基本的概念: IP(互联网协议):IP是网络层协议,涉及网络寻址和路由. IP负责根据一个或多个IP网络上的数据包头将数据包从源主机传送到目标主机. 它还定义了封装要传递的数据的数据包结构. DNS(域名服务器):DNS是一种分层分散式命名系统,用于将诸如risingstack

随机推荐