Node.js学习六(readline)


一、什么是readline

       readline是Node.js里实现标准输入输出的封装好的模块,通过这个模块我们可以以逐行的方式读取数据流。
       readline 模块提供了用于从可读流(例如 process.stdin)每次一行地读取数据的接口。 可以使用以下方式访问它:

const readline = require('readline');

二、如何使用readline

创建readline实例
调用相关的接口方法
监听与处理readline事件
举例如下:

//引入readline模块
const readline = require('readline');
//创建readline接口实例
let r1 = readline.createInterface({
    input:process.stdin,
    output:process.stdout
});
//使用question方法
r1.question('你想吃什么?',function (anwser){
    console.log(`我想吃${anwser}`);
    //添加close事件,不然不会结束
    r1.close();
});
//close事件监听
r1.on('close',function (){
    //结束程序
    process.exit(0);
});

结果如下:
在这里插入图片描述
第一步:createInterface创建了一个接口实例
第二步:调用相关方法,如question方法输入
第三步:监听readline的close事件
注意:
(1)在createInterface里,需要传入标准输入输出作为数据的输入输出流;
(2)在question方法的回调函数里,可以获取到用户的输入并进行处理,同时进行了close操作来结束程序,否则程序不会结束;
(3)在close事件的监听里,执行了process.exit(0)来使程序退出的操作,因为readline模块只要一开始获取用户输入就不会结束,必须使用这种直接的方式来结束程序。

1、Interface类

继承自: < EventEmitter >

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

2、close事件

发生以下情况之一时会触发close事件:
(1)rl.close() 方法被调用,readline.Interface 实例放弃了对 input 和 output 流的控制;
(2)input 流接收到它的 ‘end’ 事件;
(3)input 流接收 Ctrl+D 以发出传输结束(EOT)的信号;
(4)input 流接收 Ctrl+C 以发出 SIGINT 信号,并且在 readline.Interface 实例上没有注册 ‘SIGINT’ 事件监听器。
调用监听器函数时不传入任何参数。
一旦触发 ‘close’ 事件,则 readline.Interface 实例就完成了。

3、readline.createInterface(options)

options < Object >
input <stream.Readable> 要监听的可读流。 此选项是必需的。
output <stream.Writable> 要将逐行读取的数据写入的可写流。
completer < Function > 可选的用于制表符自动补全的函数。

三、实例:输入输出

      line事件,这个事件就是在用户输完一行,按下回车后就会触发的事件,它会将用户输入的数据通过回调函数传回来,可在此方法里处理用户输入的数据。

//引入readline模块
const readline = require('readline');
//创建readline接口实例
let r1 = readline.createInterface({
    input:process.stdin,
    output:process.stdout
});
//注册line事件
r1.on('line',function (line){
    switch(line.trim()){
        case 'copy':
            console.log('复制');
            break;
        case 'hello':
            r1.write('write');
            console.log('world');
            break;
        case 'close':
            r1.close();
            break;
        default:
            console.log('没有找到命令');
            break;
    }
});
//close事件监听
r1.on('close',function (){
    console.log('----end----');
    process.exit(0);
});

在这里插入图片描述

trim()的作用是去除字符串两边的空白

四、示例:模拟命令行的输入输出

const readline = require('readline');
const r1 = readline.createInterface({
    input:process.stdin,
    output:process.stdout
});
//就是给每一行设置一个提示符test
r1.setPrompt('test');
//prompt方法就是在等待用户输入数据
r1.prompt();
r1.on('line',function (line){
    switch(line.trim()){
        case 'copy':
            console.log('复制');
            break;
        case 'hello':
            console.log('world');
            break;
        case 'close':
            r1.close();
            break;
        default:
            console.log('没有找到命令');
            break;
    }
	//此处的r1.prompt()监听了'line' 事件,因为prompt方法调用
	//一次就只会读取一次数据,所以,在这个方法又调用了一次
	//prompt方法,这样就可以继续读取用户输入,从而达到一种命令
	//行的效果。
    r1.prompt();
});
r1.on('close',function (){
    console.log('----end----');
    process.exit(0);
});

方法setPromat(promat) ,就是给每一行设置一个提示符,就好比window命令行的> ,这里设置的是test。

prompt()是最重要的方法,因为它体现了readline的核心作用,以行为单位读取数据,prompt方法就是在等待用户输入数据。

结果如图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值