行读取模块readline

 2015年07月01日    283     声明


介绍一下Node.js的readline模块。在上篇文章中实现了一个文本文件内容查找程序,其中使用的主要模块就是readline模块。readline模块是一个流内容的逐行读取模块,通过require('readline')引用模块。你可以用readline模块来读取stdin,可以用来逐行读取文件流,也可用它来在控制台和用户进行一些交互。


  1. 创建Interface实例:readline.createInterface(options)
  2. Interface相关方法
  3. 相关事件


1. 创建Interface实例:readline.createInterface(options)

要使用readline相关功能,首先要创建一个Interface实例。创建Interface实例使用createInterface(options)方法,其参数options对象如下:

  • input - 监听的可读流 (必填),可以为:stdin、文件可读流等

  • output - 逐行读取(Readline)数据要写入的可写流(可选),可以为:stdout标准输出流、文件可写流等

  • completer - 用于 Tab 自动补全的可选函数

  • terminal - 如果希望以 TTY 的方式处理 inputoutput 流,则设置为 true。 并且由 ANSI/VT100 转码。默认情况下,检查 isTTY 是否在 output 流上实例化。

下面是一个通过stdinstdout创建Interface实例的示例代码:

var readline = require('readline');
var rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

创建实例后可以通过监听line事件获用户输入信息,下面将介绍一些实例方法及相关事件。


2. Interface相关方法

调用createInterface(options)方法后会返回一个包含输入/输出流的逐行读取接口的类实例,通过这个类你可以对可读流进行暂停、重启等控制,也可以向输出流写入数据等。包括以下方法:

  • rl.setPrompt(prompt):设置命令提示符,不设置为>
  • rl.prompt([preserveCursor]):为用户输入准备好逐行读取,将当前 setPrompt方法中设置的提示符显示在新行中,不设置为>。设置可选项preserveCursortrue,可以防止当前的游标重置为 0。
  • rl.question(query, callback):输出提示信息query,用户应答后触发callback方法,用户回答内容在回调方法参数中
  • rl.pause():暂停逐行读取的input输入流, 如果需要可以重新启动。pause()方法不会立即暂停流,调用pause()后还会有很多事件触发,包括line
  • rl.resume():恢复逐行读取的input输入流
  • rl.close():关闭Interface实例, 放弃对输入输出流的控制,此方法会触发close事件
  • rl.write(data[, key]):当output不为nullundefined时,write会将数据data写到output输出流。当终端是TTY时可用,key是一个代表键序列的对象。


3. 相关事件

Interface类中有些方法调用会触发对应的事件,Interface类中还有一些信号相关事件,这些事件不是通过方法调用触发的。

  • Event: 'line' - input输入流收到 \n 后触发,回调函数为function (line) {}
  • Event: 'pause' - 暂停 input 输入流后,或收到 SIGCONT 信号后触发,回调函数为function () {}
  • Event: 'resume' - 恢复 input 输入流后,回调函数为function () {}
  • Event: 'close' - 调用close 方法触发,或input输入流收到 end 事件触发,如果没有SIGCONT事件监听收SIGCONT 信号后也会触发。回调函数为function () {}
  • Event: 'SIGINT' - 当 input 输入流收到 ^C 时会触发。回调函数为function () {}
  • Event: 'SIGTSTP' - 当 input 输入流收到 ^Z 时会触发。回调函数为function () {}
  • Event: 'SIGCONT' - 当 input 输入流中含有 ^Z 并被切换到后台就会触发。回调函数为function () {}