资讯专栏INFORMATION COLUMN

Node.js学习之路20——readline模块与util模块

XFLY / 2229人阅读

摘要:使用模块逐行读取流数据创建对象在模块中,通过对象的使用来实现逐行读取流数据的处理。属性值为一个可用来写入流数据的对象,用于指定数据的输出目标。属性值为一个函数,用于指定补全处理。

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

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

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

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

+自定义util.inspect颜色
可以通过util.inspect.stylesutil.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] } } }
 * **/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93021.html

相关文章

  • JavaScript机器学习之线性回归

    摘要:不能用于机器学习太慢幻觉矩阵操作太难有函数库啊,比如只能用于前端开发开发者笑了机器学习库都是开发者机器学习库神经网络神经网络自然语言处理卷积神经网络一系列库神经网络深度学习我们将使用来实现线性回归,源代码在仓库。 译者按: AI时代,不会机器学习的JavaScript开发者不是好的前端工程师。 原文: Machine Learning with JavaScript : Part 1 ...

    gitmilk 评论0 收藏0
  • Node.js学习之路19——punycode模块os模块

    摘要:模块转换为编码模块内部使用类库以将域名从地方语言所采用的各种编码转换为可用于服务器的编码因为操作系统的核心都是英文服务器的解析也是由英文代码交换所以服务器并不支持直接的使用地方语言的域名解析所有地方语言域名的解析都需要转成编码然后由服务器解 1. punycode punycode模块转换为punycode编码 punycode模块内部使用punycode.js类库,以将域名从地方...

    xumenger 评论0 收藏0
  • 初识Node.js

    摘要:一旦替换已经完成,该模块将被完全弃用。用作错误处理事件文件,由在标准功能上的简单包装器提供所有模块都提供这些对象。 Node.js简介 Node 定义 Node.js是一个建立在Chrome v8 引擎上的javascript运行时环境 Node 特点 异步事件驱动 showImg(https://segmentfault.com/img/bVMLD1?w=600&h=237); no...

    lk20150415 评论0 收藏0
  • Node.js学习之路06——fs文件系统之目录操作文件信息

    6. 目录操作 6.1 创建目录 如果存在该目录,就创建失败 同步创建目录fs.mkdirSync(path, [mode]) const fs = require(fs); let mkdir = ./mkdir; fs.mkdir(mkdir, (err) => { if (err) { console.log(`mkdir ${mkdir} file faile...

    用户83 评论0 收藏0

发表评论

0条评论

XFLY

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<