1. 程式人生 > >Node.js readline模組與util模組的用法

Node.js readline模組與util模組的用法

本篇文章主要介紹了Node.js readline模組與util模組的使用,寫的十分的全面細緻,具有一定的參考價值,對此有需要的朋友可以參考學習下。如有不足之處,歡迎批評指正。

#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
});//歡迎加入前端全棧開發交流圈一起吹水聊天學習交流:864305860
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]
}//歡迎加入前端全棧開發交流圈一起吹水聊天學習交流:864305860

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() + ': */');
  }//歡迎加入前端全棧開發交流圈一起吹水聊天學習交流:864305860
});

生成的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<boolean>如果為true,則object的不可列舉的符號與屬性也會被包括在格式化後的結果中.預設為false.
  • depth<number>指定格式化object時遞迴的次數.這對檢視大型複雜物件很有用.預設為2.若要無限地遞迴則傳入null.
  • colors<boolean>如果為true,則輸出樣式使用ANSI顏色程式碼.預設為false.顏色可自定義.
  • customInspect<boolean>如果為false,則object上自定義的inspect(depth,opts)函式不會被呼叫.預設為true.
  • showProxy<boolean>如果為true,則Proxy物件的物件和函式會展示它們的targethandler物件.預設為false.
  • maxArrayLength<number>指定格式化時陣列和TypedArray元素能包含的最大數量.預設為100.設為null則顯式全部陣列元素.設為0*或負數則不顯式陣列元素.
  • 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'}));
//歡迎加入前端全棧開發交流圈一起吹水聊天學習交流:864305860 
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] } } }
 * **///歡迎加入前端全棧開發交流圈一起吹水聊天學習交流:864305860

結語

感謝您的觀看,如有不足之處,歡迎批評指正。

本次給大家推薦一個免費的學習群,裡面概括移動應用網站開發,css,html,webpack,vue node angular以及面試資源等。
對web開發技術感興趣的同學,歡迎加入Q群:864305860,不管你是小白還是大牛我都歡迎,還有大牛整理的一套高效率學習路線和教程與您免費分享,同時每天更新視訊資料。
最後,祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峰。