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

  

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

目录
相关文章
|
12月前
|
JSON 安全 API
电商API入门问答:开发者必知的10个基础问题
本文详解电商API的10个基础知识,涵盖定义、用途、认证、安全等内容,帮助开发者快速入门并提升开发效率。
|
12月前
|
缓存 监控 安全
电商API集成入门:从零开始搭建高效接口
在数字化电商时代,API集成成为企业提升效率、实现系统互联的关键。本文从零开始,逐步讲解如何搭建高效、可靠的电商API接口,适合初学者学习。内容涵盖API基础、认证安全、请求处理、性能优化等核心步骤,并提供Python代码示例与数学公式辅助理解。通过实践,读者可掌握构建优质电商API的技巧,提升用户体验与系统性能。
|
JSON API 开发工具
电商API接口入门指南
本文介绍了API的基础知识及其在电商领域的实际应用。首先,阐释了API的概念、运作机制及参数与返回值的作用,帮助读者理解如何通过API实现软件间的交互。接着,以获取电商商品列表为例,详细讲解了从选择平台、引入SDK到编写代码调用API的全流程。示例代码采用Python语言,利用requests库发送请求并解析JSON数据,为开发者提供了清晰的实践指导。
|
9月前
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
1785 1
Python API接口实战指南:从入门到精通
|
12月前
|
存储 安全 API
亚马逊SP-API入门:海外电商接口调用与国内平台的差异化
亚马逊 SP-API 与国内电商 API 在技术架构、安全机制及开发流程上差异显著。本文对比京东、淘宝等平台,分析接口设计、地域适配、权限管理等核心差异,并结合实战经验提供开发建议,助力开发者高效接入 SP-API,实现全球电商业务拓展。
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
9月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
331 1
|
Java 大数据
解析Java中的NIO与传统IO的区别与应用
解析Java中的NIO与传统IO的区别与应用
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
990 12
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
746 2