Node.js API详解之 readline模块用法详解
本文实例讲述了Node.jsAPI详解之readline模块用法。分享给大家供大家参考,具体如下:
Node.jsAPI详解之readline
readline模块提供了一个接口,用于从可读流(如process.stdin)读取数据,每次读取一行。
它可以通过以下方式使用:
constreadline=require('readline');
readline模块的基本用法:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=readline.createInterface({ input:process.stdin, output:process.stdout }); rl.on('line',(input)=>{ console.log(input); rl.pause(); });
pause事件
说明:
当以下之一发生时触发‘pause'事件:
input流被暂停。
input流不是暂停的,且接收到SIGCONT事件。
监听器函数被调用时不传入任何参数。
demo:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=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()方法会移动光标到给定的TTYstream中指定的位置。
demo:
constreadline=require('readline'); readline.cursorTo(process.stdout,10,2); constrl=readline.createInterface({ input:process.stdin, output:process.stdout }); rl.write('我在这!!!');
readline.moveCursor(stream,dx,dy)
说明:
readline.moveCursor()方法会移动光标到给定的TTYstream中相对当前的位置。
demo:
constreadline=require('readline'); readline.moveCursor(process.stdout,10,2); constrl=readline.createInterface({ input:process.stdin, output:process.stdout }); rl.write('我在这!!!'); //lixiaoqiangdeMacBook-Pro:NodeApixiaoqiang$nodeapp.js //我在这!!!
readline.clearScreenDown(stream)
说明:
eadline.clearScreenDown()方法会从光标的当前位置向下清除给定的TTY流。
demo:
constreadline=require('readline'); readline.clearScreenDown(process.stdout); constrl=readline.createInterface({ input:process.stdin, output:process.stdout }); rl.write('我在这!!!');
readline.clearLine(stream,dir)
说明:
readline.clearLine()方法会以dir指定的方向清除给定的TTY流的当前行。
dir:
-1–光标左边
1–光标右边
0–整行
demo:
constreadline=require('readline'); constrl=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:
constreadline=require('readline'); constrl=readline.createInterface({ input:process.stdin, output:process.stdout }); rl.write('我在这!!!'); readline.emitKeypressEvents(process.stdin);
例子一:旋转进度
constreadline=require('readline'); constrl=readline.createInterface({ input:process.stdin, output:process.stdout }); constimgArr=['/','-','\\']; letindex=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);
例子二:简单的命令行界面
constreadline=require('readline'); constrl=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! //请输入>再见!
例子三:逐行地读取文件流
constreadline=require('readline'); constfs=require('fs'); constrl=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程序设计有所帮助。