Node.js readline模块与util模块的使用


Posted in Javascript onMarch 01, 2018

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

1.1. 创建Interface对象

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

  1. input: 属性值为一个可用来读取流数据的对象,用于指定读入数据的来源。
  2. output: 属性值为一个可用来写入流数据的对象,用于指定数据的输出目标。
  3. computer: 属性值为一个函数,用于指定Tab补全处理。函数的参数值被自动设定为从该行中读入的Tab字符之前的数据,该函数应该返回一个由所有用于Tab补全时的匹配字符串组成的数组以及从该行中读入的Tab字符之前的数据。
  4. 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
});
rl.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]
}

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() + ': */');
  }
});

生成的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');
格式化字符串中,可以使用的参数指定符号

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

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

  1. *`showHidden<boolean>`如果为`true`,则`object`的不可枚举的符号与属性也会被包括在格式化后的结果中.默认为`false.`
  2. *`depth<number>`指定格式化`object`时递归的次数.这对查看大型复杂对象很有用.默认为`2`.若要无限地递归则传入`null`.
  3. *`colors<boolean>`如果为`true`,则输出样式使用`ANSI`颜色代码.默认为`false`.颜色可自定义.
  4. *`customInspect<boolean>`如果为`false`,则`object`上自定义的`inspect(depth,opts)`函数不会被调用.默认为`true`.
  5. *`showProxy<boolean>`如果为`true`,则`Proxy`对象的对象和函数会展示它们的`target`和`handler`对象.默认为`false`.
  6. *`maxArrayLength<number>`指定格式化时数组和`TypedArray`元素能包含的最大数量.默认为`100`.设为`null`则显式全部数组元素.设为`0*`或负数则不显式数组元素.
  7. *`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,holy
console.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:%s
console.log(util.format('%s', 'one', 'two', 'three', {'name': 'jack'}));

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] } } }
 * **/

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中AppendChild与insertBefore的用法详细解析
Dec 16 Javascript
javascript字母大小写转换的4个函数详解
May 09 Javascript
详解JavaScript的回调函数
Nov 20 Javascript
jQuery侧边栏实现代码
May 06 Javascript
基于JavaScript实现多级菜单效果
Jul 25 Javascript
详解VueJS应用中管理用户权限
Feb 02 Javascript
webpack v4 从dev到prd的方法
Apr 02 Javascript
详解vue-router 命名路由和命名视图
Jun 01 Javascript
微信小程序实现天气预报功能
Jul 18 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
Apr 09 Javascript
jQuery实现的移动端图片缩放功能组件示例
May 01 jQuery
OpenLayers3实现鼠标移动显示坐标
Sep 25 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
Mar 01 #Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
Mar 01 #Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
Mar 01 #Javascript
详解用Node.js写一个简单的命令行工具
Mar 01 #Javascript
vue-prop父组件向子组件进行传值的方法
Mar 01 #Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
Mar 01 #Javascript
vue父组件向子组件传递多个数据的实例
Mar 01 #Javascript
You might like
php中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
深入PHP curl参数的详解
2013/06/17 PHP
php获取文件大小的方法
2014/02/26 PHP
Opacity.js
2007/01/22 Javascript
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
JavaScript继承方式实例
2010/10/29 Javascript
jquery 使用简明教程
2014/03/05 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
深入探究AngularJS框架中Scope对象的超级教程
2016/01/04 Javascript
node.js+express制作网页计算器
2016/01/17 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
2020/03/26 Javascript
JS错误处理与调试操作实例分析
2020/04/13 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
2019/06/03 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
2019/08/23 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
Brookstone美国官网:独特新奇产品
2017/03/04 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
药剂专业学生求职信范文
2013/12/28 职场文书
工资收入证明
2014/10/07 职场文书
项目合作意向书
2015/05/08 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
pytorch 如何使用float64训练
2021/05/24 Python
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript
springboot实现string转json json里面带数组
2022/06/16 Java/Android