Node.js readline模塊與util模塊的使用
1. 使用readline模塊逐行讀取流數(shù)據(jù)
1.1. 創(chuàng)建Interface對象
在readline模塊中,通過Interface對象的使用來實現(xiàn)逐行讀取流數(shù)據(jù)的處理。因此首先要創(chuàng)建Interface對象,在readline模塊中,可以通過createInterface方法來創(chuàng)建Interface對象.readline.createInterface(options),options為一個對象,屬性如下
- input: 屬性值為一個可用來讀取流數(shù)據(jù)的對象,用于指定讀入數(shù)據(jù)的來源。
- output: 屬性值為一個可用來寫入流數(shù)據(jù)的對象,用于指定數(shù)據(jù)的輸出目標。
- computer: 屬性值為一個函數(shù),用于指定Tab補全處理。函數(shù)的參數(shù)值被自動設(shè)定為從該行中讀入的Tab字符之前的數(shù)據(jù),該函數(shù)應(yīng)該返回一個由所有用于Tab補全時的匹配字符串組成的數(shù)組以及從該行中讀入的Tab字符之前的數(shù)據(jù)。
- terminal: 該屬性為一個布爾類型的屬性,當需要像一個終端那樣實時地將輸入數(shù)據(jù)流進行輸出,且需要在輸出數(shù)據(jù)中寫入ANSI/VT100控制字符串時,需要將該屬性值設(shè)置為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('行數(shù)據(jù)讀取操作被終止'); }); 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文件的內(nèi)容
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');
代碼內(nèi)容
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文件的內(nèi)容
/*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方法,將第一個參數(shù)值作為一個格式化字符串,將其他參數(shù)值作為該格式化字符串中所使用的各中參數(shù),返回一個經(jīng)過格式化處理后的字符串.util.format('您輸入了%d個參數(shù),參數(shù)值分別為%s,%s,%s',3,'nice','excelent','holy');
格式化字符串中,可以使用的參數(shù)指定符號
- *`%s`:用于指定字符串參數(shù)
- *`%d`:用于指定數(shù)值參數(shù),包括整數(shù)及浮點數(shù)
- *`%j`:用于指定一個`JSON`對象
- *`%%`:用于指定一個百分號
- *如果格式化字符串中使用的參數(shù)個數(shù)多于format方法中使用的除了`format`參數(shù)之外的其他參數(shù),則格式化字符串中多于的參數(shù)將不被替換.`console.log(util.format('%s:%s','one'));`
- *如果格式化字符串中使用的參數(shù)個數(shù)少于`format`方法中使用的除了`format`參數(shù)之外的其他參數(shù),則根據(jù)`format`方法中多于參數(shù)值的類型自動將其轉(zhuǎn)換為字符串,中間使用一個空格進行分割.
+inspect(object,[options])返回一個字符串,該字符串包含了對象的信息,在調(diào)試應(yīng)用程序的過程中非常有用.
- *`showHidden<boolean>`如果為`true`,則`object`的不可枚舉的符號與屬性也會被包括在格式化后的結(jié)果中.默認為`false.`
- *`depth<number>`指定格式化`object`時遞歸的次數(shù).這對查看大型復(fù)雜對象很有用.默認為`2`.若要無限地遞歸則傳入`null`.
- *`colors<boolean>`如果為`true`,則輸出樣式使用`ANSI`顏色代碼.默認為`false`.顏色可自定義.
- *`customInspect<boolean>`如果為`false`,則`object`上自定義的`inspect(depth,opts)`函數(shù)不會被調(diào)用.默認為`true`.
- *`showProxy<boolean>`如果為`true`,則`Proxy`對象的對象和函數(shù)會展示它們的`target`和`handler`對象.默認為`false`.
- *`maxArrayLength<number>`指定格式化時數(shù)組和`TypedArray`元素能包含的最大數(shù)量.默認為`100`.設(shè)為`null`則顯式全部數(shù)組元素.設(shè)為`0*`或負數(shù)則不顯式數(shù)組元素.
- *`breakLength<number>`一個對象的鍵被拆分成多行的長度.設(shè)為`Infinity`則格式化一個對象為單行.默認為`60`.
+自定義util.inspect顏色
可以通過util.inspect.styles和util.inspect.colors屬性全局地自定義util.inspect的顏色輸出(如果已啟用)
const util = require('util'); console.log(util.format('您輸入了%d個參數(shù),參數(shù)值分別為%s,%s,%s', 3, 'nice', 'excelent', 'holy')); //您輸入了3個參數(shù),參數(shù)值分別為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] } } } * **/
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
開箱即用的Node.js+Mysql模塊封裝實現(xiàn)詳解
這篇文章主要為大家介紹了開箱即用的Node.js+Mysql模塊封裝實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01node.js中的querystring.parse方法使用說明
這篇文章主要介紹了node.js中的querystring.parse方法使用說明,本文介紹了querystring.parse的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下2014-12-12Node.js?中使用fetch?按JSON格式發(fā)post請求的問題解析
最近在測試一個api,可以用curl命令直接訪問,指定header相關(guān)配置,request?body(JSON),成功后返回一個JSON,這篇文章主要介紹了Node.js?中使用fetch?按JSON格式發(fā)post請求,需要的朋友可以參考下2023-04-04Nodejs使用fs-extra模塊進行目錄和文件操作用法示例
fs-extra模塊是基于fs?的文件操作相關(guān)工具庫,封裝了一些fs實現(xiàn)起來相對復(fù)雜的工具,下面這篇文章主要給大家介紹了關(guān)于Nodejs使用fs-extra模塊進行目錄和文件操作用法的相關(guān)資料,需要的朋友可以參考下2024-06-06