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 相关文章推荐
图片放大镜jquery.jqzoom.js使用实例附放大镜图标
Jun 19 Javascript
使用requestAnimationFrame实现js动画性能好
Aug 06 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
Apr 01 Javascript
第一次接触JS require.js模块化工具
Apr 17 Javascript
在web中js实现类似excel的表格控件
Sep 01 Javascript
JS中精巧的自动柯里化实现方法
Dec 12 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
Feb 06 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
Mar 09 Javascript
JS+canvas五子棋人机对战实现步骤详解
Jun 04 Javascript
vue用elementui写form表单时,在label里添加空格操作
Aug 13 Javascript
react的hooks的用法详解
Oct 12 Javascript
浅谈node.js中间件有哪些类型
Apr 29 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.ini中文版
2006/10/09 PHP
探讨PHP中OO之静态关键字以及类常量的详解
2013/06/07 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
javascript 实用的文字链提示框效果
2010/06/30 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
2015/03/31 Javascript
jquery实现清新实用的网页菜单效果
2015/08/28 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
2017/01/13 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
2017/05/26 Javascript
Vue2.0权限树组件实现代码
2017/08/29 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
解决layer.open弹出框不能获取input框的值为空的问题
2019/09/10 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
JavaScript canvas实现跟随鼠标事件
2020/02/10 Javascript
uni-app 自定义底部导航栏的实现
2020/12/11 Javascript
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
python3.4控制用户输入与输出的方法
2018/10/17 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
Django框架基础模板标签与filter使用方法详解
2019/07/23 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
恶意软件的定义
2014/11/12 面试题
影视艺术学院毕业生自荐信
2013/11/13 职场文书
幼儿园毕业园长感言
2014/02/24 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
党员自评材料范文
2014/12/17 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书