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’,我们来看运行结果。

  

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

目录
相关文章
|
JSON 安全 API
电商API入门问答:开发者必知的10个基础问题
本文详解电商API的10个基础知识,涵盖定义、用途、认证、安全等内容,帮助开发者快速入门并提升开发效率。
|
缓存 监控 安全
电商API集成入门:从零开始搭建高效接口
在数字化电商时代,API集成成为企业提升效率、实现系统互联的关键。本文从零开始,逐步讲解如何搭建高效、可靠的电商API接口,适合初学者学习。内容涵盖API基础、认证安全、请求处理、性能优化等核心步骤,并提供Python代码示例与数学公式辅助理解。通过实践,读者可掌握构建优质电商API的技巧,提升用户体验与系统性能。
|
JSON 算法 API
一文掌握 1688 商品详情 API 接口:从入门到实战
1688是国内领先的综合电商批发平台,提供海量商品资源。其商品详情API助力开发者与企业获取商品的详细信息(如属性、价格、库存等),广泛应用于电商数据分析、比价系统及采购场景。API支持GET/POST请求,需传入通用参数(app_key、timestamp等)与业务参数(如product_id)。返回JSON格式数据,包含商品标题、价格、图片链接等详情,提升业务效率与决策精准度。
4735 6
|
JSON API 开发工具
电商API接口入门指南
本文介绍了API的基础知识及其在电商领域的实际应用。首先,阐释了API的概念、运作机制及参数与返回值的作用,帮助读者理解如何通过API实现软件间的交互。接着,以获取电商商品列表为例,详细讲解了从选择平台、引入SDK到编写代码调用API的全流程。示例代码采用Python语言,利用requests库发送请求并解析JSON数据,为开发者提供了清晰的实践指导。
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
2101 1
Python API接口实战指南:从入门到精通
|
数据挖掘 API 开发者
京东商品详情 API 接口全攻略:从入门到精通
京东商品详情API接口是京东开放平台为开发者提供的服务,用于获取商品详细信息。通过调用接口,开发者可获得商品属性、价格、库存、促销信息等数据,适用于电商应用、价格比较工具及数据分析平台等场景。支持GET/POST请求方式,参数包括API版本、密钥等。示例代码展示了如何使用Python的requests库调用该接口,并获取JSON格式的返回数据,包含商品基本信息、价格、库存和用户评价等内容。
598 16
|
存储 安全 API
亚马逊SP-API入门:海外电商接口调用与国内平台的差异化
亚马逊 SP-API 与国内电商 API 在技术架构、安全机制及开发流程上差异显著。本文对比京东、淘宝等平台,分析接口设计、地域适配、权限管理等核心差异,并结合实战经验提供开发建议,助力开发者高效接入 SP-API,实现全球电商业务拓展。
|
JavaScript 内存技术
Node.js 编写接口入门学习(GET、POST)
Node.js 编写接口入门学习(GET、POST)
331 2
|
JavaScript 内存技术
Node.js 编写接口入门学习(GET、POST)
Node.js 编写接口入门学习(GET、POST)
340 0
|
JavaScript
node.js入门学习(2):使用http-server创建简单的http服务的方法
node.js入门学习(2):使用http-server创建简单的http服务的方法
337 0