博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js readline模块与util模块的用法
阅读量:7221 次
发布时间:2019-06-29

本文共 4470 字,大约阅读时间需要 14 分钟。

本篇文章主要介绍了Node.js readline模块与util模块的使用,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。

1. 使用readline模块逐行读取流数据

1.1. 创建Interface对象

在readline模块中,通过Interface对象的使用来实现逐行读取流数据的处理。因此首先要创建Interface对象,在readline模块中,可以通过createInterface方法来创建Interface对象.readline.createInterface(options),options为一个对象,属性如下

  • input: 属性值为一个可用来读取流数据的对象,用于指定读入数据的来源。
  • output: 属性值为一个可用来写入流数据的对象,用于指定数据的输出目标。
  • computer: 属性值为一个函数,用于指定Tab补全处理。函数的参数值被自动设定为从该行中读入的Tab字符之前的数据,该函数应该返回一个由所有用于Tab补全时的匹配字符串组成的数组以及从该行中读入的Tab字符之前的数据。
  • terminal: 该属性为一个布尔类型的属性,当需要像一个终端那样实时地将输入数据流进行输出,且需要在输出数据中写入ANSI/VT100控制字符串时,需要将该属性值设置为true,默认属性值等于output属性值对象的isTTY属性值。
// 输入 exit, quit,q这三个任意之一的时候,会退出const readline = require('readline');let rl = readline.createInterface({  input: process.stdin,  output: process.stdout,  completer: completer});//欢迎加入前端全栈开发交流圈一起吹水聊天学习交流:864305860rl.on('line', (line) => {  if (line === 'exit' || line === 'quit' || line === 'q') {    rl.close();  } else {    console.log('您输入了:', line);  }}); rl.on('close', () => {  console.log('行数据读取操作被终止');}); function completer(line) {  const completions = '.help .error .exit .quit .q'.split(' ');  let hits = completions.filter((c) => {    return c.indexOf(line) === 0;  });  return [hits.length ? hits : completions, line]}//欢迎加入前端全栈开发交流圈一起吹水聊天学习交流:864305860

1.2. 使用Interface对象逐行读取文件

原fs.js文件的内容

console.log('this is line 1');console.log('this is line 2');console.log('this is line 3');console.log('this is line 4');console.log('this is line 5');

代码内容

const readline = require('readline');const fs = require('fs');let file = fs.createReadStream('./fs.js');let out = fs.createWriteStream('./anotherFs.js');let index = 1;out.write('/*line' + index.toString() + ": */");let rl = readline.createInterface({  input: file,  output: out,  terminal: true});rl.on('line', (line) => {  if (line === '') {    rl.close();  } else {    index++;    out.write('/*line' + index.toString() + ': */');  }//欢迎加入前端全栈开发交流圈一起吹水聊天学习交流:864305860});

生成的anotherFs.js文件的内容

/*line1: */console.log('this is line 1');/*line2: */console.log('this is line 2');/*line3: */console.log('this is line 3');/*line4: */console.log('this is line 4');/*line5: */console.log('this is line 5');/*line6: */

2. 使用util模块中提供的一些方法

+format方法
类似于C语言中的printf方法,将第一个参数值作为一个格式化字符串,将其他参数值作为该格式化字符串中所使用的各中参数,返回一个经过格式化处理后的字符串.util.format('您输入了%d个参数,参数值分别为%s,%s,%s',3,'nice','excelent','holy');
格式化字符串中,可以使用的参数指定符号

  • %s:用于指定字符串参数
  • %d:用于指定数值参数,包括整数及浮点数
  • %j:用于指定一个JSON对象
  • %%:用于指定一个百分号
  • 如果格式化字符串中使用的参数个数多于format方法中使用的除了format参数之外的其他参数,则格式化字符串中多于的参数将不被替换.console.log(util.format('%s:%s','one'));
  • 如果格式化字符串中使用的参数个数少于format方法中使用的除了format参数之外的其他参数,则根据format方法中多于参数值的类型自动将其转换为字符串,中间使用一个空格进行分割.

+inspect(object,[options])返回一个字符串,该字符串包含了对象的信息,在调试应用程序的过程中非常有用.

  • showHidden<boolean>如果为true,则object的不可枚举的符号与属性也会被包括在格式化后的结果中.默认为false.
  • depth<number>指定格式化object时递归的次数.这对查看大型复杂对象很有用.默认为2.若要无限地递归则传入null.
  • colors<boolean>如果为true,则输出样式使用ANSI颜色代码.默认为false.颜色可自定义.
  • customInspect<boolean>如果为false,则object上自定义的inspect(depth,opts)函数不会被调用.默认为true.
  • showProxy<boolean>如果为true,则Proxy对象的对象和函数会展示它们的targethandler对象.默认为false.
  • maxArrayLength<number>指定格式化时数组和TypedArray元素能包含的最大数量.默认为100.设为null则显式全部数组元素.设为0*或负数则不显式数组元素.
  • breakLength<number>一个对象的键被拆分成多行的长度.设为Infinity则格式化一个对象为单行.默认为60.

+自定义util.inspect颜色

可以通过util.inspect.styles和util.inspect.colors属性全局地自定义util.inspect的颜色输出(如果已启用)

const util = require('util');console.log(util.format('您输入了%d个参数,参数值分别为%s,%s,%s', 3, 'nice', 'excelent', 'holy'));//您输入了3个参数,参数值分别为nice,excelent,holyconsole.log(util.format('一个JSON对象%j', {'name': 'jack', 'age': 25}));// 一个JSON对象{"name":"jack","age":25}console.log(util.format('一个百分号%'));// 一个百分号%console.log(util.format('%s:%s', 'one'));// one:%sconsole.log(util.format('%s', 'one', 'two', 'three', {'name': 'jack'}));//欢迎加入前端全栈开发交流圈一起吹水聊天学习交流:864305860 function test(one, two) {  return one + two;} let parent = new Object();parent.name = 'parent';parent.func = test; let child1 = new Object();child1.name = 'child1';parent.child1 = child1; let child2 = new Object();child2.name = 'child2';child1.child = child2; let child3 = new Object();child3.name = 'child3';child2.child = child3; child2.inspect = function (depth) {  return util.inspect(this, {depth: depth - 2, customInspect: false})};console.log(util.inspect(parent, {customInspect: true, depth: 4}));/** * { name: 'parent', *  func: [Function: test], *  child1: *  { name: 'child1', *   child: { name: 'child2', child: [Object], inspect: [Function] } } } * **///欢迎加入前端全栈开发交流圈一起吹水聊天学习交流:864305860

结语

感谢您的观看,如有不足之处,欢迎批评指正。

转载地址:http://lshym.baihongyu.com/

你可能感兴趣的文章
专业上的常用的工具和类库集 By 老衣
查看>>
firefox与chrome中对select下拉框中的option支持问题
查看>>
JetBrains PyCharm 4.0.4 key
查看>>
随机产生32位字符串
查看>>
iOS UISearchController的使用
查看>>
在平面中,一个点绕任意点旋转θ度后的点的坐标
查看>>
怎样差别上升沿、下降沿、低电平、高电平
查看>>
出自 HTML4 规范的可用颜色字符串值列表(常用颜色名称及对应的十六进制值)...
查看>>
收集数据至泛型Dictionary
查看>>
如何将phantomjs单独部署在服务端
查看>>
datatable的点击事件
查看>>
Eureka的自我保护模式
查看>>
android 无线连接eclipse
查看>>
React 小案例 订单列表评价
查看>>
设计模式-观察者模式
查看>>
JAVA 8 函数式接口--Function
查看>>
操作系统同步原语
查看>>
字符串与JavaScript之间的魔术—前端模板的原理及简单实现
查看>>
redux原来如此简单
查看>>
【刷算法】层次遍历二叉树
查看>>