NODE(buffer、fs、path)
Node
- 特點:
- 可以讓js跑在瀏覽器之外
- 可以操作讀寫
- 同步異步
- 同步:代碼依次執行
- 異步:同步代碼執行後再執行(定時器,callback)–》效率高
- 學習要求:
- 自己寫接口,前後端分離,寫網站(ejs jade)
- 阻塞和非阻塞
- 請求–》內核業務處理–》毀掉後針對請求處理
Buffer
- 1.定義及特點
- (1)定義:緩存區,操作的是二進制的數據,表現出來的是16進制
- (2)特點
- a.可以和字符串進行轉換
- b.buffer中存的是內存空間(像二維數組)
- 2.字節
- 八個二進制數組成一個字節
- 1b=8bit(8個二進制) 一字節=8比特
- 換算公式:當前位的最大值*進制^(所在位-1) 累加的和
- 一個字,三個字節
3.固定大小buffer創建方式
var buffer=new Buffer();
(1)通過長度創建buffer
var buffer1=new Buffer(100);//隨機創建100個大的16進制 buffer1.fill(0);//將每個16進制上填成0
(2)放置字符串
var buffer=new Buffer('珠峯'); console.log(buffer.length);//buffer的長度
(3)放數組
- 數組中的值>255 對256取模,餘數是當前值
- 數組中的值<0 在原來基礎上+256
- 數組中的值無法識別–》0
var buffer=new Buffer([100,101,102]); console.log(buffer); /*原始數組 var a=[1,2]; var arr=[a,1,2]; var newArr=arr.slice(0); a[0]=100; console.log(newArr);//數組中存的是地址*/
4.buffer操作
- (1)slice
var buffer=new Buffer([1,2,3]); var newBuffer=buffer.slice(0,1);
(2)write
- 參數1 : string 要寫入的內容
- 參數2 : 偏移量
- 參數3 : 寫入的長度
- 參數4 :編碼格式
–》參數沒寫時 默認是0
var buffer=new Buffer(12); buffer.write('珠峯'); buffer.write('培訓',6); console.log(buffer.toString());//珠峯培訓
- (3)copy
- 參數1:targetbuffer 目標buffer
- 參數2:sourceStart目標源開始
- 參數3 : targetstart 目標開始
- 參數4: sourceEnd目標源結束
-》參數2,3,4用數字表示(字的字節數)
var buffer=new Buffer(12); var buffer1=new Buffer('珠峯'); var buffer2=new Buffer('培訓'); buffer1.copy(buffer); buffer2.copy(buffer,6); console.log(buffer.toString());
- (4)fill
buffer1.fill(0);//將每個16進制上填成0
- (5)concat
- 參數1:傳入的buffer數組
- 參數2:傳入數據總長度(可有可無)
concat詳解 /** * * @param list 傳入一個buffer數組 * @param totalLength 總長度,可傳可不傳 */ Buffer.myConcat=function (list, totalLength) { //1.沒傳,算出長度,構建buffer,將數組中的buffer拷貝 if(typeof totalLength=='undefined'){ totalLength=0; list.forEach(function (item) { totalLength+=item.length; }); Buffer.concat([buffer1,buffer2],totalLength).toString() } //2.傳了totalLength,構建了buffer,將buffer1,buffer2拷貝上去 var buffer=new Buffer(totalLength); var index=0; list.forEach(function (item) { item.copy(buffer,index); index+=item.length;//計算當前拷貝的總長度 }); //3.slice截取到多餘長度 return buffer.slice(0,index); }; console.log(Buffer.concat([buffer1,buffer2]).toString());//buffer 放在數組中
進制轉換
fs(file system)
1.讀取文件
- 特點
- 只能讀取已經存在的內容
- 默認是buffer類型
- 將內容讀取到內容中,readFile不能讀取比內存大的文件
類型
- 同步
- 可以使用try catch
- 結果放到回調函數中
- 異步【readFile 】
- 解決方式–》回調函數
- 參數1:error-first:將回調函數的第一個參數作爲錯誤參數
- 參數2:參數2:編碼格式
- 參數3:回調函數
- 可以看到文件內容
- 解決方式–》回調函數
讀取方式1:
var school={}; fs.readFile('./name.txt','utf8',function (err,data) { school.name=data; fs.readFile('./age.txt','utf8',function (err, data) { school.age=data; console.log(school) }); });
讀取方式2:並行讀取
fs.readFile('./name.txt','utf8',function (err,data) { school.name=data; out(); }); fs.readFile('./age.txt','utf8',function (err, data) { school.age=data; out(); }); function out() { //Object.keys(school)將對象的屬性轉換成數組 if(Object.keys(school).length==2){ console.log(school); } }
- 同步
- 特點
- 2.寫文件 【writeFileSync / writeFile】
const fs=require('fs');
fs.writeFileSync('./name.txt',new Buffer('珠峯'));
//異步
fs.writeFile('./name.txt','hello',function (err) {
console.log(err)
});
3.拷貝文件copy
- 同步拷貝
var fs=require('fs'); function copySync(source,target) { //readFileSync +writeFileSync var result=fs.readFileSync(source,'utf8'); fs.writeFileSync(target,result) } copySync('./name.txt','./n.txt');
- 異步拷貝
function copy(source,target) { //readFile+writeFile fs.readFile(source,'utf8',function (err, data) { if(err){ console.log(err) }else{ fs.writeFile(target,data,function (err) { if(err){console.log(err)} }); } }) } copy('./name.txt','.n/txt');
- 執行次數的追加 【flag/appendFileSync】
(1)flag fs.writeFileSync('./name.txt','hello',{flag:'a'}); (2)appendFileSync=》讓flag默認爲a fs.appendFileSync('./name.txt','hello');
4.文件夾的操作
- 創建
- 有父親才能創建兒子
- fs.mkdirSync(‘parent’)
- 讀
- fs.readFile
- 寫
- writeFileSync
- writeFile
- 是否存在
- fs.existsSync(‘parent’);
- 追加
- appendFileSync
- 刪除目錄
- fs.rmdirSync(‘parent’);
- 刪除文件
- unlink
- unlinkSync
- 循環創建實例
(1) 同步: function makep(path) { var arr=path.split('/'); arr.forEach(function (item, index) { let temp=arr.slice(0,index+1).join('/'); //刪除前判斷文件夾是否存在 var flag=fs.existsSync(temp); if(!flag){ fs.mkdirSync(temp) } }) } makep('parent/child/child');
path
- 創建
- 核心模塊-》自帶的
var path=require('path');
//以當前目錄的文件名生成一個絕對路徑
操作
- join
console.log(path.join(__dirname,'1.js')); //D:\學習培訓\NODE C模塊\node2\8.path\1.js console.log(path.join(__dirname,'..','1.js'));//上一級 // D:\學習培訓\NODE C模塊\node2\1.js
- resolve**
console.log(path.resolve('../1.js')); // D:\學習培訓\NODE C模塊\node2\1.js
- herits
- extname
console.log(path.extname('a.min.js')); //.js
- sep 分隔符
console.log(path.sep); // \
event****
function Man() { this._events={}; } Man.prototype.on=function (eventName, callback) { if(this._events[eventName]){ this._events[eventName].push(callback);//第二次找到 }else{ this._events[eventName]=[callback]; } }; Man.prototype.emit=function (eventName,...args) {//將剩餘參數轉數組 // [].slice.call(arguments,1); // Array.from(arguments);//直接把arguments轉化成數組 類數組轉數組 if(this._events[eventName]){ this._events[eventName].forEach((item) =>{// 箭頭函數不存在this指向,內部this指向外部this item.apply(this,args);//將參數一個個傳進去 }) } }; Man.prototype.removeListener=function (eventName, callback) { if(this._events[eventName]){ this._events[eventName]= this._events[eventName].filter(function (item) { //true 留下 false 刪除,返回一個新數組 return item!=callback&&item.g!=callback;//有一個爲false就刪除 }) } }; Man.prototype.once=function (eventName,callback) { //callback 觸發後移除 function one() {//最終觸發one方法 將one中的參數傳給callback callback.apply(this,arguments); this.removeListener(eventName,one); } one.g=callback;//{'有錢了':[one.g=callback]} this.on(eventName,one); //在one方法上體現代表的是哪個one }; var man=new Man(); function buyCar(who,who1) { console.log('給'+who+who1+'買車'); } function buyBag(who,who1) { console.log('給'+who+who1+'買包'); } man.on('有錢了',buyCar); //man.on('有錢了',buyBag);//執行幾次,觸發幾次 man.once('有錢了',buyBag);//執行多次只觸發一次 原理:觸發一次,將自己從數組中移除 man.removeListener('有錢了',buyCar);//移除事件綁定,再有錢之後不執行買車 //man.removeListener('有錢了',buyBag);//移除事件綁定,再有錢之後不執行買車 once 移除 執行結果是什麼都沒有了 man.emit('有錢了','妹子','666');