文件系統
在Node中,與文件系統的交互是非常重要的,服務器的本質就是將本地的文件發送到遠程的客戶端
Buffer(緩沖區)
Node中提供的新的對象,這個對象可以在node中直接使用,不需要引入;和js中的數組(js數組缺點:無法存儲二進制數據)非常相似;Buffer中只能保存二進制數據
- 在Buffer中每一個元素都是二進制數據,但是直接打印時,會以十六進制顯示;Buffer中每一個范圍在00 ff之間(0 255),對應的二進制是00000000 11111111
-
buf.length
獲取的是內容占用內存的大小,而不是長度;每個漢字在內存中占用3個字節
-
- 將一個字符串轉換為一個Buffer
var buf = Buffer.from('Hello');
- Buffer轉換為字符串
var str = buf.toString();
- 創建一個Buffer對象
-
var buf = Buffer.alloc(size);
- 分配內存并初始化
- size 是Buffer的大小,size的單位是kb,可直接計算;(alloc:分配)
-
- 向buf中添加元素
- 通過索引對buffer中的元素進行操作
- 只要數字輸出如console.log(10)/alert(10)就是會以十進制輸出
- Number的toString(2/8/16)可以指定數字的進制
- Buffer的大小一旦確認則不能修改;因為Buffer是直接對內存進行操作;為了性能更好所以大小都是不能改變
- 數字的值不要超過255,超過會溢出
- 遍歷
for(var i=0; i < Buffer.length; i++){
console.log(buf[i])
}
-
Buffer.allocUnsafe(size)
- 創建一個指定大小的Buffer,不初始化。該Buffer中可能含有敏感數據
- 比Buffer.alloc(size) 性能高,但是不安全
fs 文件系統
Node通過fs模塊和文件系統進行交互,使用文件系統必須先引入fs模塊;fs模塊屬于node的核心模塊,不需下載,直接引入即可
- fs模塊操作都有同步和異步調用
- 同步會阻塞系統;異步不會阻塞系統
- 異步肯定會有回調函數
- fs模塊中所有方法都有兩份版本
- 不帶sync,異步版本
- 帶sync,同步版本
- 文件寫入
- 打開文件 如果沒有文件會自動新建文件
fs.open(path,flags[,mode],callback);
fs.openSync(path,flags[,mode]);
參數:
path 打開文件的路徑
flags 對文件操作的類型,需要一個字符串作為參數 'r'/'w'
mode 設置文件的權限(主要針對Linux),一般不傳
callback 回調函數,所有的異步方法必有回調函數
同步操作依靠返回值:當打開文件以后,會返回一個文件描述符作為返回值;文件描述符: 在形式上是一個非負整數。實際上,它是一個索引值,指向內核為每一個進程所維護的該進程打開文件的記錄表。當程序打開一個現有文件或者創建一個新文件時,內核向進程返回一個文件描述符。
- 寫入內容并保存
fs.write(fd,string[,position[,encoding]],callback);
fs.writeSync(fd,string[,position[,encoding]]);
參數:
fd:要寫入的文件的描述符
string:要寫入的內容
position:寫入的起始的位置
encoding:寫入文件的編碼 默認utf-8
- 關閉文件
fs.close(fd,callback);
fs.closeSync(fd);
參數:
fd:要關閉的文件的文件描述符
異步文件寫入
callback 回調函數,所有的異步方法必有回調函數
異步方法都是通過回調函數(的參數形式)返回結果
回調函數有兩個參數:
- err 錯誤信息,如果該對象存在,則證明出錯了(錯誤優先原則)
- fd 文件操作符,代表此時打開的文件
打開文件代碼:
fs.open('fileName','w',function(err,fd){
//如果沒有錯誤
if(!err){
//寫入文件
fs.write(fd,'string',function(err){
if(!err){
//輸出一句話
console.log('寫入成功')
}
//關閉文件
fs.close(fd,function(err){
if(!err){
//輸出一句話
console.log('關閉成功')
}
});
});
}
});
簡單文件寫入
fs.writeFile(filePath,data[,options],callback)
fs.writeFileSync(filePath,data[,options])
參數:
filePath:要寫入的文件的路徑
data:要寫入的數據(String或Buffer)
options:配置選項,需要一個對象作為參數,一般不需要
- encoding 文件的編碼 默認--utf8
- mode 文件的權限(一般不寫) 默認--0666
- flag 操作的類型 默認 'w'
callback 寫入完成以后調用的函數
fs.writeFile('filePath','內容',function(err){
if(!err){
console.log('寫入成功')
}else if(err){
console.log(err)
}
})
文件的操作符
- w 對文件進行寫操作 文件不存在則報錯
- r 對文件進行讀操作 文件不存在則新建
- a 對文件進行追加操作 文件不存在則新建
流式文件寫入
- 傳統的寫入方式都是一次性將內容寫入到文件中,如果文件過大,先將內容全部加載進內存后寫入,這樣在寫入較大的數據時,容易導致內存溢出或者性能較差
- 所以我們需要引入流式文件寫入來處理較大的文件
- 流主要使用兩種
- 可寫流
- 可讀流
//創建可寫流
var ws = fs.createWriteStream('filePath');
//監視流的狀態,可以通過為流綁定open和close事件來監視流的狀態(多次)
ws.on('open',function(){
console.log('流打開了')
});
ws.on('close',function(){
console.log('流關閉了')
})
//once()可以為一個對象綁定一個一次性的事件,該事件將會在觸發一次后自動失效(一次)
ws.once('open',function(){
console.log('流打開了')
});
ws.once('close',function(){
console.log('流關閉了')
})
//通過可寫流向文件寫入內容
ws.write('datas')
//關閉流
ws.close(); 此方法會導致數據缺失
ws.end(); 可以將數據寫入到文件,并關閉流
文件讀取
1. 同步文件讀取
2. 異步文件讀取
3. 簡單文件讀取
fs.readFile(path[,options],callBack);
fs.readFileSync(path[,options]);
- 參數:
- path:讀取文件的路徑
- options:配置對象
- encoding:指定打開文件的編碼,默認是null
- flag:文件的操作類型,默認是 r
- callBack:回調函數,通過回調函數返回讀取到的數據
- err:錯誤對象
- data:返回的數據(Buffer)
fs.readFile('fileName',function(err,date){
if(!err){
console.log(data);
//將讀取到的數據寫入到磁盤的其他位置
fs.writeFile('path',data,function(err){
if(!err){
console.log('寫入成功')
}
})
}
})
4. 流式文件讀取
- 流式文件讀取,適合較大的文件
//創建一個可讀流
var rs = fs.creatReadStream('fileName');
var ws = fs.creatWritStream('fileName');
rs.pipe(ws);
//監聽rs的打開和關閉事件
rs.once('open',function(){
console.log('');
});
rs.once('close',function(){
console.log('');
});
//通過可讀流讀取一個文件,必須為流綁定data事件,當綁定data事件以后,流會自動讀取
rs.on('data',function(data){
console.log(data);
});
其他操作
- 驗證路徑是否存在
fs.existsSync('path');
- 返回值:文件存在為true;文件不存在為false
- 同步和異步方法各有特點,具體情況區分使用
- 用來獲取一個文件的狀態
fs.stat(path,callBack);
fs.statSync(path);
參數:
- path:要獲取狀態文件的路徑
- callBack:
- err:錯誤對象
- stats:狀態對象,用來描述文件的狀態
- 刪除一個文件
fs.unlink('path',callBack);
fs.unlinkSync('path');
- 讀取當前目錄下的所有文件和文件夾的列表
fs.readdir('path'[,options],callBack);
fs.readdirSync('path'[,options]);
- 截斷文件,使文件變成指定大小
fs.truncate('path',length,callBack);
fs.truncateSync('path',length);
- 創建文件夾
fs.mkdir('path'[, options],callBack);
fs.mkdirSync('path'[, options]);
- 刪除文件夾
fs.rmdir('path',callBack);
fs.rmdirSync('path');
- 重寫文件和目錄名:可以實現剪切功能
fs.rename('oldPath','newPath',callBack);
fs.renameSync('oldPath','newPath');
- 監聽文件 每隔一段時間去判斷文件是否發生改變
fs.watchFile(filename[,option],listener);
- listener:回調函數,傳遞兩個參數,是stats類型的對象
- current:表示當前文件的狀態
- previous:表示修改之前文件的狀態
- listener:回調函數,傳遞兩個參數,是stats類型的對象