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练习之表单验证实现代码
Dec 14 Javascript
深入理解Javascript中的循环优化
Nov 09 Javascript
js实现Select列表内容自动滚动效果代码
Aug 20 Javascript
谈谈对JavaScript原生拖放的深入理解
Sep 20 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
Sep 28 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
Nov 04 Javascript
详解VUE2.X过滤器的使用方法
Jan 11 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
Sep 17 Javascript
jquery无缝图片轮播组件封装
Nov 25 jQuery
微信自定义分享链接信息(标题,图片和内容)实现过程详解
Sep 04 Javascript
JsonServer安装及启动过程图解
Feb 28 Javascript
MutationObserver在页面水印实现起到的作用详解
Jul 07 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地址引用(php地址引用的效率问题)
2012/03/23 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
pjblog修改技巧汇总
2007/03/12 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
javascript eval(func())使用示例
2013/12/05 Javascript
javascript:json数据的页面绑定示例代码
2014/01/26 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
将List对象列表转换成JSON格式的类实现方法
2016/07/04 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
javascript标准库(js的标准内置对象)总结
2018/05/26 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
详解Vue后台管理系统开发日常总结(组件PageHeader)
2019/11/01 Javascript
Vue 监听元素前后变化值实例
2020/07/29 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中几种导入模块的方式总结
2017/04/27 Python
pandas实现选取特定索引的行
2018/04/20 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
2018/12/18 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
2020/12/09 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
“四风”问题对照检查材料思想汇报
2014/09/16 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书