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:要写入逐行读取数据的可写流。

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程序设计有所帮助。

以上是 Node.js API详解之 readline模块用法详解 的全部内容, 来源链接: utcz.com/z/350672.html

回到顶部