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 相关文章推荐
javascript 类方法定义还是有点区别
Apr 15 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
Dec 27 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
Dec 04 Javascript
Jquery Ajax方法传值到action的方法
May 11 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
Oct 25 Javascript
Web前端框架Angular4.0.0 正式版发布
Mar 28 Javascript
Vue实现购物车场景下的应用
Nov 27 Javascript
vue-lazyload使用总结(推荐)
Nov 01 Javascript
微信小程序 自定义复选框实现代码实例
Sep 04 Javascript
vue实现数字动态翻牌的效果(开箱即用)
Dec 08 Javascript
js实现简单的秒表
Jan 16 Javascript
VUE实时监听元素距离顶部高度的操作
Jul 29 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
我的群发邮件程序
2006/10/09 PHP
php&mysql 日期操作小记
2012/02/27 PHP
PHP技术开发微信公众平台
2015/07/22 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
2016/07/06 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
javascript SocialHistory 检查访问者是否访问过某站点
2008/08/02 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
JavaScript实现仿Clock ISO时钟
2018/06/29 Javascript
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
vue自定义switch开关组件,实现样式可自行更改
2019/11/01 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
2020/08/13 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
[41:17]VG vs Optic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
python 循环遍历字典元素的简单方法
2016/09/11 Python
Python数据结构之单链表详解
2017/09/12 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
django用户登录验证的完整示例代码
2019/07/21 Python
python对验证码降噪的实现示例代码
2019/11/12 Python
Python模块 _winreg操作注册表
2020/02/05 Python
python在一个范围内取随机数的简单实例
2020/08/16 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
韩国女装NO.1网店:STYLENANDA
2016/09/16 全球购物
一份全面的PHP面试问题考卷
2012/07/15 面试题
求职信标题怎么写
2014/05/26 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
老干部工作汇报材料
2014/10/28 职场文书
2015年法院工作总结范文
2015/04/28 职场文书
推广普通话的宣传语
2015/07/13 职场文书
初二物理教学反思
2016/02/19 职场文书
windows下快速安装nginx并配置开机自启动的方法
2021/05/11 Servers
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python