Node.js API详解之 readline模块用法详解
本文实例讲述了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要写入逐行读取数据的可写流。
pleter一个可选的函数,用于 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程序设计有所帮助。
编程语言
- 甘肃哪有关键词排名优化购买方式有哪些
- 甘肃SEO如何做网站优化
- 河南seo关键词优化怎么做电话营销
- 北京SEO优化如何做QQ群营销
- 来宾百度关键词排名:提升您网站曝光率的关键
- 卢龙关键词优化:提升您网站排名的策略与技巧
- 山东网站优化的注意事项有哪些
- 四川整站优化怎样提升在搜索引擎中的排名
- 疏附整站优化:提升网站性能与用户体验的全新
- 海南seo主要做什么工作售后服务要做到哪些
- 荣昌百度网站优化:提升您网站的搜索引擎排名
- 河北seo网站排名关键词优化如何做SEO
- 江西优化关键词排名推广售后保障一般有哪些
- 古浪SEO优化:提升你的网站可见性
- 西藏网站排名优化怎么把网站排名在百度首页
- 如何提升阳东百度快照排名:详尽指南