Node.js API详解之 readline模块用法详解


Posted in Javascript onMay 22, 2020

本文实例讲述了Node.js API详解之 readline模块用法。分享给大家供大家参考,具体如下:

Node.js API详解之 readline

readline 模块提供了一个接口,用于从可读流(如 process.stdin)读取数据,每次读取一行。
它可以通过以下方式使用:

const readline = require('readline');

readline 模块的基本用法:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.question('你认为 Node.js 中文网怎么样?', (answer) => {
 // 对答案进行处理
 console.log(`多谢你的反馈:${answer}`);
 rl.close();
});

注意:当调用该代码时,Node.js 程序不会终止,直到 readline.Interface 被关闭,因为接口在等待 input 流中要被接收的数据。

readline.createInterface(options)

说明:

readline.createInterface() 方法会创建一个新的 readline.Interface 实例。
options:
input:要监听的可读流。该选项是必需的。
output:要写入逐行读取数据的可写流。
completer:一个可选的函数,用于 Tab 自动补全。
terminal:如果 input 和 output 应被当作一个 TTY,且要写入 ANSI/VT100 转换的代码,则设为 true。 默认为实例化时在 output 流上检查 isTTY。
historySize:保留的历史行数的最大数量。 设为 0 可禁用历史记录。 该选项只有当 terminal 被用户或内部 output 设为 true 时才有意义,否则历史缓存机制不会被初始化。 默认为 30。
prompt:要使用的提示字符串。默认为 ‘> ‘。
crlfDelay:如果 \r 与 \n 之间的延迟超过 crlfDelay 毫秒,则 \r 和 \n 都会被当作换行分隔符。 默认为 100 毫秒。
removeHistoryDuplicates:设置为true时,将从历史列表中删除较旧的值。默认为 false。

demo:

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

Interface 类

说明:

readline.Interface 类的实例是使用 readline.createInterface() 方法构造的。
每个实例都关联一个 input 可读流和一个 output 可写流。
output 流用于为到达的用户输入打印提示,且从 input 流读取。

line 事件

说明:

每当 input 流接收到行结束符(\n、\r 或 \r\n)时触发 ‘line' 事件。
通常发生在用户按下 键或 键。
监听器函数被调用时会带上一个包含接收的那一行输入的字符串。

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.on('line', (line) => {
 console.log(`接收到:${line}`);
});
// 1
// 接收到:1
// 2
// 接收到:2
// 3
// 接收到:3

rl.write(data[, key])

说明:

rl.write() 方法会把 data 或一个由 key 指定的按键序列写入到 output。
data:输出内容
key:
ctrl: 如果为 true 则表示 ctrl 键。
meta: 如果为 true 则表示 Meta 键。
shift: 如果为 true 则表示 Shift 键。
name: 一个按键的名称。
只有当 output 是一个 TTY 文本终端时,key 参数才被支持。
如果指定了 key,则 data 会被忽略。
当被调用时,如果 input 流已被暂停,则 rl.write() 会恢复 input 流。
如果 readline.Interface 被创建时 output 被设为 null 或 undefined,则 data 和 key 不会被写入。

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.write('请输入姓名:');
rl.on('line', (input) => {
 //模拟 Ctrl+c 退出进程。
 rl.write('', {ctrl: true, name: 'c'});
});

rl.question(query, callback)

说明:

rl.question() 方法通过写入到 output 来展示 query,并等待用户提供到 input 的输入,
然后调用 callback 函数并传入提供的输入作为第一个参数。
query:一个在提示符之前、要写入 output 的叙述或询问。
callback:一个回调函数,它会被调用并带上用户响应 query 的输入。
当被调用时,如果 input 流已被暂停,则 rl.question() 会恢复 input 流。
如果 readline.Interface 被创建时 output 被设为 null 或 undefined,则 query 不会被写入。

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.question('你是谁?', (answer) => {
 console.log('你好%s',answer);
});
// 你是谁?xiaoqiang
// 你好xiaoqiang

rl.close()

说明:

rl.close() 方法会关闭 readline.Interface 实例,且撤回对 input 和 output 流的控制。
但被调用时,'close' 事件会被触发。

demo:

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

close 事件

说明:

当以下之一发生时,触发 ‘close' 事件:
rl.close() 方法被调用,且 readline.Interface 实例已撤回对 input 流和 output 流的控制;
input 流接收到 ‘end' 事件;
input 流接收到表示结束传输的 ctrl-D;
input 流接收到表示 SIGINT 的 ctrl-C,且 readline.Interface 实例上没有注册 SIGINT 事件监听器。
监听器函数被调用时不传入任何参数。
当 ‘close' 事件被触发时,readline.Interface 实例应当被视为已结束。

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.on('close', () => {
 console.log('已退出......')
});
rl.close();

SIGTSTP 事件

说明:

每当 input 流接收到一个 ctrl-Z 输入(通常被称为 SIGTSTP)时,触发 ‘SIGTSTP' 事件。
当 input 流接收到一个 SIGTSTP 时,如果没有注册 ‘SIGTSTP' 事件监听器,则 Node.js 进程会被发送到后台。
如果 input 流在进程被发送到后台之前被暂停,则 ‘pause' 和 SIGCONT 事件不会被触发。
监听器函数被调用时不传入任何参数。

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.on('SIGTSTP', () => {
 console.log('退出请按Ctrl + c');
});

SIGINT 事件

说明:

每当 input 流接收到一个 ctrl-C 输入(通常被称为 SIGINT)时,触发 ‘SIGINT' 事件。
当 input 流接收到一个 SIGINT 时,如果没有注册 ‘SIGINT' 事件监听器,则 ‘pause' 事件会被触发。
监听器函数被调用时不传入任何参数。

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.on('SIGINT', () => {
 console.log('已退出...');
 rl.close();
});

SIGCONT 事件

说明:

当一个 Node.js 进程使用 ctrl-Z(也就是 SIGTSTP)移入后台之后再使用 fg [ job_id ] 移回前台时,触发 ‘SIGCONT' 事件。
如果 input 流在 SIGTSTP 请求之前被暂停,则事件不会被触发。
监听器函数被调用时不传入任何参数。

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.on('SIGCONT', () => {
 console.log('已唤起...');
});

rl.prompt([preserveCursor])

说明:

rl.prompt() 方法会在 output 流中新的一行写入 readline.Interface 实例配置后的 prompt,
用于为用户提供一个可供输入的新的位置。
preserveCursor:如果为 true,则阻止光标落点被设为 0。
当被调用时,如果 input 流已被暂停,则 rl.prompt() 会恢复 input 流。
如果 readline.Interface 被创建时 output 被设为 null 或 undefined,则提示不会被写入。

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.question('你是谁?', (answer) => {
 console.log('你好%s',answer);
 rl.prompt();
});

rl.setPrompt(prompt)

说明:

rl.setPrompt() 方法用于设置每当 rl.prompt() 被调用时要被写入到 output 的提示。
prompt:提示内容

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.setPrompt('用户输入:');
rl.on('line', (input) => {
 console.log(input);
 rl.prompt();
});

rl.pause()

说明:

rl.pause() 方法会暂停 input 流,且稍后需要时可被恢复。
调用 rl.pause() 不会立刻暂停其他事件(包括 ‘line')被 readline.Interface 实例触发。

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.on('line', (input) => {
 console.log(input);
 rl.pause();
});

pause 事件

说明:

当以下之一发生时触发 ‘pause' 事件:
input 流被暂停。
input 流不是暂停的,且接收到 SIGCONT 事件。
监听器函数被调用时不传入任何参数。

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.on('pause', () => {
 console.log('Readline 被暂停。');
});
rl.on('line', (input) => {
 console.log(input);
 rl.pause();
});

rl.resume()

说明:

如果 input 流已被暂停,则 rl.resume() 方法会恢复 input 流。

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.on('line', (input) => {
 console.log(input);
 rl.pause();
 setTimeout( () => {
  rl.resume();
 },1000);
});

resume 事件

说明:

每当 input 流被恢复时触发 ‘resume' 事件。
监听器函数被调用时不传入任何参数

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.on('resume', () => {
 console.log('Readline 被恢复。');
});
rl.on('line', (input) => {
 console.log(input);
 rl.pause();
 setTimeout( () => {
  rl.resume();
 },1000);
});

readline.cursorTo(stream, x, y)

说明:

readline.cursorTo() 方法会移动光标到给定的 TTY stream 中指定的位置。

demo:

const readline = require('readline');
readline.cursorTo(process.stdout, 10, 2);
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.write('我在这!!!');

readline.moveCursor(stream, dx, dy)

说明:

readline.moveCursor() 方法会移动光标到给定的 TTY stream 中相对当前的位置。

demo:

const readline = require('readline');
readline.moveCursor(process.stdout, 10, 2);
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.write('我在这!!!');
// lixiaoqiangdeMacBook-Pro:NodeApi xiaoqiang$ node app.js
//      我在这!!!

readline.clearScreenDown(stream)

说明:

eadline.clearScreenDown() 方法会从光标的当前位置向下清除给定的 TTY 流。

demo:

const readline = require('readline');
readline.clearScreenDown(process.stdout);
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.write('我在这!!!');

readline.clearLine(stream, dir)

说明:

readline.clearLine() 方法会以 dir 指定的方向清除给定的 TTY 流的当前行。
dir:
-1 ? 光标左边
1 ? 光标右边
0 ? 整行

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.write('我在这!!!');
readline.clearLine(process.stdout, -1);

readline.emitKeypressEvents(stream[, interface])

说明:

readline.emitKeypressEvents() 方法使给定的可读流 stream 相应于接收到的输入触发 ‘keypress' 事件。
可选的 interface 指定了一个 readline.Interface 实例,用于当自动补全被禁用时检测到复制粘贴输入。
如果 stream 是一个 TTY,则它必须为原始模式。

demo:

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
rl.write('我在这!!!');
readline.emitKeypressEvents(process.stdin);

例子一:旋转进度

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout
});
const imgArr = ['/', '-', '\\'];
let index = 0;
setInterval(() => {
 readline.clearLine(process.stdout, -1);
 readline.moveCursor(process.stdout, -1, 0);
 rl.write(imgArr[index]);
 if(index === 2){
 index=0;
 }else{
 index++;
 }
}, 200);

例子二:简单的命令行界面

const readline = require('readline');
const rl = readline.createInterface({
 input: process.stdin,
 output: process.stdout,
 prompt: '请输入> '
});
rl.prompt();
rl.on('line', (line) => {
 switch (line.trim()) {
  case 'hello':
   console.log('world!');
   break;
  default:
   console.log(`你输入的是:'${line.trim()}'`);
   break;
 }
 rl.prompt();
}).on('close', () => {
 console.log('再见!');
 process.exit(0);
});
// 请输入> 1
// 你输入的是:'1'
// 请输入> hello
// world!
// 请输入> 再见!

例子三:逐行地读取文件流

const readline = require('readline');
const fs = require('fs');
const rl = readline.createInterface({
 input: fs.createReadStream('stdout.log'),
 crlfDelay: Infinity
});
rl.on('line', (line) => {
 console.log(`文件的单行内容:${line}`);
});
// 文件的单行内容:1
// 文件的单行内容:2
// 文件的单行内容:3
// 文件的单行内容:4
// 文件的单行内容:5
// 文件的单行内容:6
// 文件的单行内容:7
// 文件的单行内容:8
// 文件的单行内容:9
// 文件的单行内容:0

希望本文所述对大家node.js程序设计有所帮助。

Javascript 相关文章推荐
多浏览器兼容性比较好的复制到剪贴板的js代码
Oct 09 Javascript
『jQuery』.html(),.text()和.val()的概述及使用
Apr 22 Javascript
JavaScript 数组详解
Oct 10 Javascript
使用JSLint提高JS代码质量方法分享
Dec 16 Javascript
原生JavaScript+LESS实现瀑布流
Dec 12 Javascript
深入理解JavaScript中的对象
Jun 04 Javascript
详解JavaScript中的客户端消息框架设计原理
Jun 24 Javascript
jQuery.uploadify文件上传组件实例讲解
Sep 23 Javascript
jQuery取得元素标签名称小结(附代码)
Aug 16 jQuery
Vue.js 2.0和Cordova开发webApp环境搭建方法
Feb 26 Javascript
vue弹窗消息组件的使用方法
Sep 24 Javascript
Vue实现table上下移动功能示例
Feb 21 Javascript
vue+canvas实现移动端手写签名
May 21 #Javascript
基于canvas实现手写签名(vue)
May 21 #Javascript
jQuery实现移动端笔触canvas电子签名
May 21 #jQuery
js cavans实现静态滚动弹幕
May 21 #Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
May 21 #Javascript
JavaScript实现HSL拾色器
May 21 #Javascript
js实现拾色器插件(ColorPicker)
May 21 #Javascript
You might like
php中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
基于php-fpm 参数的深入理解
2013/06/03 PHP
PHP eval函数使用介绍
2013/12/08 PHP
php版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
2016/03/17 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
Yii Framework框架开发微信公众平台示例
2020/04/26 PHP
JavaScript中Math对象使用说明
2008/01/16 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
如何获取JQUERY AJAX返回的JSON结果集实现代码
2012/12/10 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
JavaScript中的标签语句用法分析
2015/02/10 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
vue的diff算法知识点总结
2018/03/29 Javascript
vue实现的树形结构加多选框示例
2019/02/02 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
[03:57]DOTA2英雄梦之声_第03期_幻影刺客
2014/06/21 DOTA
python 编程之twisted详解及简单实例
2017/01/28 Python
基于Python os模块常用命令介绍
2017/11/03 Python
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
python3结合openpyxl库实现excel操作的实例代码
2018/09/11 Python
手把手教你使用Python创建微信机器人
2019/04/29 Python
Django实现跨域的2种方法
2019/07/31 Python
python web框架 django wsgi原理解析
2019/08/20 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
竞选班干部的演讲稿
2014/04/24 职场文书
成本会计实训报告
2014/11/05 职场文书
项目验收申请报告
2015/05/15 职场文书
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server