node.js入门 - 10.api:io

简介:   I/O是使node与其他框架与众不同的很重要的一个部分,本章将解释它是如何实现node非堵塞I/O的。   Streams   stream api是一个抽象接口,他帮助node中很多部分实现不间断输入和输出的操作。

  I/O是使node与其他框架与众不同的很重要的一个部分,本章将解释它是如何实现node非堵塞I/O的。

  Streams

  stream api是一个抽象接口,他帮助node中很多部分实现不间断输入和输出的操作。stream api为它的实现类提供了一些通用的方法和属性,streams可以是可读的、可写的或者两者都是,并且他们都实现了EventEmitter,可以emit事件。

   可读streams

  可读streams提供了一系列的方法和事件,使我们可以对数据源的数据进行访问。基本上,可读stream就是为了触发data事件,同时他提供了一些属性允许你对获取的数据大小和获取速度进程配置。来看下面的例子,我们从一个文件中读取文件,每次当有数据可以读取的时候,都会触发data事件。

var fs = require('fs');
var filehandle = fs.readFile('data.txt', function(err, data) {
  console.log(data)
});

  通常我们需要把数据存在一个变量中,当stream结束的时候,一起输出结果。

var spool = "";
stream.on('data', function(data) {
  spool += data;
});
stream.on('end', function() {
  console.log(spool);
});

  

  (文件系统)Filesystem

  当我们需要访问硬盘上文件的时候,我们需要使用filesystem模块。他非常接近于POSIX风格的文件I/O,对所有方法提供异步和同步两种版本。我们推荐使用异步的方法,虽然这样会使代码变的稍微复杂,但是可以让你并行访问多个文件,并减少脚本运行的时间。

  当我们使用异步方法的时候,时常遇到的问题就是代码执行顺序的问题。因为异步方式是不能保证执行顺序的,当一个操作依赖于另外一个操作的时候就会出现问题,如下例:

var fs = require('fs');
fs.readFile('warandpeace.txt', function(e, data) {
  console.log('War and Peace: ' + data);
});
fs.unlink('warandpeace.txt');

   这里存在的问题是,当我们还没有读完文件内容的时候,就有可能执行了文件删除的操作。为了解决这个问题,我们需要稍微修改代码,使用内部回调,如下:

var fs = require('fs');
fs.readFile('warandpeace.txt', function(e, data) {
  console.log('War and Peace: ' + data);
  fs.unlink('warandpeace.txt');
});

 

   Buffers

  虽然node使用javascript作为开发语言,但是他与javascript传统的执行环境是有区别的。例如,浏览器中的javascript更多的是执行函数,而对2进制数据的处理则比较少。虽然javascript支持位运算,但是他没有原生2进制数据的表现形式。node提供了buffer类方便你对2进制数据的操作。

 

   非常重要说明的一点是,当你拷贝一个字符串到Buffer,他们将会以2进制的形式存储,当然你也可以把buffer转换成字符串。可以使用三种参数创建buffer对象,第一种参数是buffer的长度,第二种是bytes数组,第三种是字符串。例如,我们在node REPL输入下面的语句,设置buffer长度为10:

new Buffer(10);

  node会给buffer提供一个长度为10的内存区域,但是这段区域是系统刚释放出来的,里面的内容设置还没来得及清除,所以每次运行上面的语句得到的运行结果是不一样的。

   在node中默认使用utf-8的编码格式,当然你也可以改变编码格式。

new Buffer('foobarbaz');
new Buffer('foobarbaz', 'ascii');
new Buffer('foobarbaz', 'utf8');
new Buffer('é');
new Buffer('é', 'utf8');
new Buffer('é', 'ascii');

   node提供了其他方法去操作buffer,例如Buffer.write()。传入字符串和索引(默认为0)参数,如果buffer有足够的空间,我们将会从指定的索引开始,把buffer内容完全替换成字符串内容;否则我们将会截取字符串,以适应从索引开始位置到结尾的buffer的长度。最后返回修改的buffer内容的长度。

var b = new Buffer(1);
b
b.write('a');
b
b.write('é');
b

  定义一个长度为1的buffer,从索引0开始覆写buffer内容为‘a’,这时buffer内容被修改,索引也增加到1。我们再次覆写buffer内容,这时buffer从索引1开始已经没有空间了,所以覆写失败,buffer内容没有发生变化。执行结果如下,可以说明一切。

  再看一个例子:

var b = new Buffer(5);
b.write('fffff');
b
b.write('ab', 1);
b

  创建一个长度为5的buffer,覆写内容为‘fffff’,从索引1开始覆写内容为‘ab’,我们来看运行结果。

  

  本节课的内容就讲完了,有什么疑问可以给我留言。

adpics.aspx?source=kbh1983&sourcesuninfo
目录
相关文章
|
29天前
|
缓存 JavaScript 前端开发
深入浅出:使用Node.js构建RESTful API
【9月更文挑战第3天】在数字化浪潮中,后端开发如同搭建一座连接用户与数据的桥梁。本文将带领读者从零开始,一步步用Node.js搭建一个功能完备的RESTful API。我们将探索如何设计API的结构、处理HTTP请求以及实现数据的CRUD操作,最终通过一个简单的实例,展示如何在真实世界中应用这些知识。无论你是初学者还是有一定经验的开发者,这篇文章都会为你揭示后端开发的奥秘,让你轻松入门并掌握这一技能。
67 3
|
5天前
|
JavaScript 前端开发 小程序
一小时入门Vue.js前端开发
本文是作者关于Vue.js前端开发的快速入门教程,包括结果展示、参考链接、注意事项以及常见问题的解决方法。文章提供了Vue.js的基础使用介绍,如何安装和使用cnpm,以及如何解决命令行中遇到的一些常见问题。
一小时入门Vue.js前端开发
|
9天前
|
JSON 前端开发 JavaScript
socket.io即时通信前端配合Node案例
本文介绍了如何使用socket.io库在Node.js环境下实现一个简单的即时通信前端配合案例,包括了服务端和客户端的代码实现,以及如何通过socket.io进行事件的发送和监听来实现实时通信。
14 2
|
2月前
|
JavaScript NoSQL API
深入浅出:使用Node.js构建RESTful API
【8月更文挑战第31天】本文将引导读者了解如何利用Node.js搭建一个高效、易于扩展的RESTful API。通过简单易懂的语言和逐步深入的内容组织,我们将一起探索Node.js在后端开发中的实际应用,包括环境配置、路由设计、数据处理与连接数据库等关键步骤。文章末尾,你将获得完整的项目代码示例,助你快速启动自己的API项目。
|
2月前
|
JavaScript 前端开发 API
深入浅出:使用Node.js搭建RESTful API的实践之旅
【8月更文挑战第31天】本文将带你踏上一次Node.js的探险之旅,通过实际动手构建一个RESTful API,我们将探索Node.js的强大功能和灵活性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的实践经验和深刻的技术洞见。
|
2月前
|
JavaScript 前端开发 中间件
深入浅出Node.js:从零开始构建RESTful API
【8月更文挑战第24天】在数字化时代的浪潮中,后端开发作为支撑现代网络服务的骨架,扮演着至关重要的角色。本文将通过Node.js这一高效灵活的JavaScript运行环境,引领你步入后端开发的神秘世界。我们将从基础概念出发,逐步深入到实战操作,最终构建一个功能完备的RESTful API。无论你是编程新手还是前端开发者,这篇文章都将为你揭示后端开发的奥秘,让你轻松掌握使用Node.js进行API开发的实用技巧。
|
2月前
|
存储 JavaScript API
Node.js中的异步API
【8月更文挑战第16天】
29 1
|
2月前
|
JavaScript 前端开发 NoSQL
使用Node.js进行后端开发入门
【8月更文挑战第10天】恭喜你完成了Node.js后端开发的入门之旅!这只是个开始,Node.js的世界远比这广阔。随着你对Node.js的深入学习和实践,你将能够构建更复杂、更强大的后端应用。不断探索、学习和实践,你将在Node.js的道路上越走越远。
|
1月前
|
JSON JavaScript 中间件
深入浅出Node.js: 从零开始构建RESTful API
【8月更文挑战第34天】 在数字时代的浪潮中,掌握如何构建高效、可靠的后端服务是每一位开发者的必备技能。本文将通过浅显易懂的语言和实际代码示例,带领初学者走进Node.js的世界,一步步搭建起自己的RESTful API。无论你是编程新手,还是想扩展技术栈的老手,这篇文章都将是你的良师益友。让我们一起探索Node.js的魅力,开启后端开发之旅!
|
2月前
|
JSON JavaScript 中间件
深入浅出Node.js: 从零开始构建RESTful API
【8月更文挑战第31天】 在数字时代的浪潮中,掌握如何构建高效、可靠的后端服务是每一位开发者的必备技能。本文将通过浅显易懂的语言和实际代码示例,带领初学者走进Node.js的世界,一步步搭建起自己的RESTful API。无论你是编程新手,还是想扩展技术栈的老手,这篇文章都将是你的良师益友。让我们一起探索Node.js的魅力,开启后端开发之旅!
下一篇
无影云桌面