什么是readline

readline允许从可读流中以逐行的方式读取数据,比如process.stdin等。 在node.js命令行模式下默认引入了readline模块,但如果是使用node.js运行脚本的话,则需要自己通过require('readline')方式手动引入该模块。

怎么使用readline

创建实例

首先、创建一个接口实例,提供一个Object类型的参数。参数如下: input: 监听的可读流(必需) output: 写入readline的可写流(必需) completer: 用于 Tab 自动补全的可选函数(不常用) terminal: 如果希望 input 和 output 流像 TTY 一样对待,那么传递参数 true ,并且经由 ANSI/VT100 转码。 默认情况下检查 isTTY 是否在 output 流上实例化。(不常用) historySize: 保留行历史纪录最大值,为了禁用该值被设置为0,默认为30,只有在terminal被设置为true或通过一个内部输出检查时,这个选项才有作用,否则历史缓存机制不会初始化。(不常用)

第一种方式:只传入两个必传参数

  const readLine = require('readline');let rl = readLine.createInterface(process.stdin, process.stdout);
复制代码

第二种方式:可以传入其他非必需参数

  const readLine = require('readline');let rl = readLine.createInterface({input: process.stdin,output: process.stdout,// 其他参数省略})
复制代码

实例

  const readLine = require('readline');let rl = readLine.createInterface({input: process.stdin,output: process.stdout,prompt: '> 请输入'})// 调用rl.prompt(); // 控制台结果显示:>请输入
复制代码

注意:一旦该代码被调用,Node.js程序将不会终止知道readline接口被关闭,因为接口会在输入流中不停的等待数据。

方法

以下所有的实例均依据如下rl所创建:

  const readLine = require('readline');let rl = readLine.createInterface({input: process.stdin,output: process.stdout})
复制代码
1、rl.setPrompt([prompt])

设置提示符,当你使用node运行该文件,并且调用rl.prompt()时,会在终端看到你设置的提示prompt,即“> 请输入”

  rl.setPrompt('> 请输入')
复制代码

注意:该方法和上面的实例参数配置是一样的效果

2、rl.prompt([preserveCursor])

为用户输入准备好readline,将现有的setPrompt选项放到新的一行,让用户有一个新的地方开始输入。将preserveCursor设为true来防止光标位置被重新设定成0。   如需要换行输入,即在新的一行,输入信息,可在prompt中加入\n。

  rl.prompt(); // 控制台结果显示:>请输入
复制代码
3、rl.write(data[, key])

当使用readline.createInterface()创建实例时,,如果输入流为null或者undefined,则写入数据到输出流。   key是一个表示键序列的字面量对象,如果终端是TTY,则可用。

  rl.write('Delete me!');// Simulate ctrl+u to delete the line written previouslyrl.write(null, {ctrl: true, name: 'u'});
复制代码
4、rl.question(query, callback)

预先制定提示内容query,将会在用户输入被应答后,触发执行指定的回掉函数callback。

  rl.question('你今年多大了?\n', function(prompt) {console.log('这是你输入的回答结果:' + prompt);rl.close();})
复制代码
5、rl.pause()

暂停readline的输入流,可以恢复,rl.resume()、rl.write()、rl.question()和rl.prompt()均可以恢复该输入流。   调用该方法会触发pause事件。

6、rl.resume()

恢复readline的输入流。   调用该方法会触发resume事件。

7、rl.close()

关闭readline创建的实例,不控制输入输出流。   调用该方法会触发close事件。

事件

1、line事件

无论何时,在输入流接收了一个行结束符(\n, \r, 或者 \r\n)时触发,即在用户输入后,按了回车或者返回键时触发该事件。可以用来监听用户输入。

  rl.on('line', function (line) {console.log('这是用户输入的内容:' + line);})
复制代码
2、pause事件

输入流被暂停时触发,即调用了rl.pause(),或者没有暂停输入流,在收到 SIGCONT/SIGINT,且readline.Interfacce实例上并没有注册SIGCONT/SIGINT监听器时,也会被触发,并且如果输入流在收到SIGTSIP之前就已经被暂停了,那么该事件也不会触发。

  rl.on('pause', function() {console.log('暂停输入流...')})
复制代码
3、resume事件

输入流重新启动时被触发,即调用了rl.resume()、或者rl.write()、rl.question()和rl.prompt()。

  rl.on('resume', function() {console.log('恢复输入流...')})
复制代码
4、close事件

调用rl.close()方法时会触发该事件,或者输入流接收到“结束”事件。以下的任意一种情况都会触发close事件。 一旦close事件被触发,则认为readline.Interaface实例已经终止。 1)、rl.close()方法被调用后,readline.Interaface实例便会放弃输入输出流的控制权。 2)、输入流接收到自己的“end”事件。 3)、输入流接收到-C,发送SIGINT信号,并且在readline.Interfacce实例上并没有注册SIGINT事件的监听器。 4)、输入流接收到-D,发送传输结束信号(EOF,end-of-transmission); 5)、EOT:定界符,即输入单个或多个“>”,并按下回车时。

  rl.on('close', function() {console.log('关闭输入流...');process.exit(0); // 退出当前进程})
复制代码
5、SIGCOUT(该事件在window系统上不起作用)

当使用-Z将Node.js进程移动到后台时,SIGCONT事件将会被触发。然后可以使用 fg(1) 命令将它移动到前台。   如果输入流在收到SIGTSIP之前就已经被暂停了,那么该事件就不会触发。

6、SIGINT

当输入流收到-C命令时,我们熟知的SIGINT事件就会被触发。如果当时并没有注册任何SIGINT事件监听器,那么当输入流接收到SIGINT信号时,’pause’事件和’close’事件均会被触发。

7、SIGTSTP(该事件在window系统上不起作用)

当输入流收到-Z命令时,我们熟知的SIGTSTP事件就会被触发。如果没有注册SIGTSTP事件监听器,那么当输入流收到SIGTSTP事件时,Node.js进程就将会被移动到后台。   如果输入在进程被发送到后台之前就已经被暂停了,那么’pause’和’SIGCONT’事件就将不会被触发。

参见官方文档 参考案例看笑话readline

Node.js之readline模块的使用相关推荐

  1. java调用node脚本并获取输出,Node.js用readline模块实现输入输出

    什么是Readline Readline是Node.js里实现标准输入输出的封装好的模块,通过这个模块我们可以以逐行的方式读取数据流.使用require("readline")可以 ...

  2. node.js中模块_在Node.js中需要模块:您需要知道的一切

    node.js中模块 by Samer Buna 通过Samer Buna 在Node.js中需要模块:您需要知道的一切 (Requiring modules in Node.js: Everythi ...

  3. 浅析 Node.js 的 vm 模块以及运行不信任代码

    为什么80%的码农都做不了架构师?>>>    在一些系统中,我们希望给用户提供插入自定义逻辑的能力,除了 RPC 和 REST 之外,运行客户提供的代码也是比较常用的方法,好处是可 ...

  4. Node.js 初识 fs 模块

    fs 模块是文件操作的封装,它提供了文件的读取.写入.更名.删除.遍历目录.链接等 Unix 文件系统操作.与其他模块不同的是,fs 模块中所有的操作都提供了 同步 和 异步 两个版本,比如读取文件内 ...

  5. 开场 Live,分享点干货——「深入了解 Node.js 包与模块机制」

    先放上 Live 地址: www.zhihu.com/lives/84274- 本次 Live 将深入剖析 Node.js 包与模块机制,包括且不限于解析 Node.js 源码.社区规范等.本人认为这 ...

  6. php node 目录,node.js基于fs模块对系统文件及目录进行读写操作的方法详解

    本文主要介绍了node.js基于fs模块对系统文件及目录进行读写操作的方法,结合实例形式分析了nodejs使用fs模块针对文件与目录的读写.创建.删除等相关操作技巧,需要的朋友可以参考下. 如果要用这 ...

  7. Node.js web应用模块之forever

    javascript 一统江湖的势头越来越猛,越来越重的前端,不得不实施前后端分离,angular.js 成功把前端javascript抽象成了一个复杂的MVC框架,注意,它是一个框架,可不是普普通通 ...

  8. Node.js web应用模块之Supervisor

    在开发或调试Node.js应用程序的时候,当你修改js文件后,总是要按下CTRL+C终止程序,然后再重新启动,即使是修改一点小小的参数,也 总是要不断地重复这几个很烦人的操作.这是因为Node.js ...

  9. node.js中ws模块创建服务端和客户端,网页WebSocket客户端

    首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...

最新文章

  1. ArcGIS Engine10.4版本
  2. 海康摄像头取、录像机RTSP视频流的字串格式
  3. 云炬随笔20170901
  4. Dockerfile指令详解:WORKDIR 指定工作目录
  5. Qt / 对 C++ 的拓展有哪些
  6. mave工程中的一个类调用另一个聚合工程的一个类_求求你,别再写上千行的类了好吗...
  7. HTML网页设计期末课程大作业~旅游住宿酒店的HTML网页设计(14页) ~学生网页设计作业源码 旅游网页代码 学生网页设计与制作期末作业下载 DW旅游网页作业代码下载...
  8. 线性分类的鸢尾花数据集Jupyter实践
  9. 算高差改正数的计算机程序,水准测量中测量高差的改正数怎么计算?
  10. 怎样在Excel顶部单元格操作锁定,技巧干货!Excel如何冻结首行单元格?
  11. Python简单方法实现英文文本词频统计
  12. Java监听器实现网站在线人数统计
  13. phpinfo函数的使用
  14. R语言初探之存储模型/报童问题
  15. 【迷人的爪哇】—带你从零开始了解Java
  16. 编程之美-第1章 游戏之乐
  17. 云服务器访问延时高怎么解决?
  18. 高校副院长被举报抄袭同事硕士学位论文,学校回应!
  19. 搜索专题-----bfs、dfs模板,栈,队列
  20. 达内java2019项目_Java学员作品-达内图书馆管理系统

热门文章

  1. SpringMVC REST 风格静态资源访问配置
  2. 国际化(1)---JS文件国际化
  3. [轉]SQL Server 2005备份维护计划
  4. .NET中做多语言版本的心得 1
  5. 宁波大学计算机网络实验五,宁波大学计算机网络实验答案.doc
  6. 手把手玩转win8开发系列课程(18)
  7. Asp.net服务器端控件CheckBoxList的使用心得
  8. 今天你写控件了吗?----ASP.net控件开发系列(三)
  9. MySql命令行创建和删除触发器
  10. 干货整理 Unity3D资源汇总