1.什么是流?
流是程序輸入輸出的一個連續的字節序列。
有文件流,網絡流,設備(例如鼠標,鍵盤,磁盤,調制解調器和打印機)的輸入輸出都是用流來處理的。
任何數據的最根本表現形式都是二進制。
讀取文件
用異步方式讀取
fs.readFile(filename,callback);
異步的方法函數最后一個參數為回調函數,回調函數的第一個參數包含了錯誤信息(error)。
寫入文件
語法
以下為異步模式下寫入文件的語法格式:
fs.writeFile(filename, data[, options], callback)
如果文件存在,該方法寫入的內容會覆蓋舊的文件內容。
參數
參數使用說明如下:
-
path - 文件路徑。
-
data - 要寫入文件的數據,可以是 String(字符串) 或 Buffer(流) 對象。
-
options - 該參數是一個對象,包含 {encoding, mode, flag}。默認編碼為 utf8, 模式為 0666 , flag 為 'w'
-
callback - 回調函數,回調函數只包含錯誤信息參數(err),在寫入失敗時返回。
//文件復制 const fs=require('fs'); const path=require('path'); console.time('read'); fs.readFile('D:\\nodejs\\01.txt',(error,data)=>{ if(error){ throw error } console.timeEnd('read'); console.time('write'); //讀取文件拿到 fs.writeFile('D:\\nodejs\\02.txt',data,error=>{ if(error){ throw error } console.timeEnd('write'); console.log('拷貝完成'); }); });
但是如果大文件的拷貝的話,內存就受不了
而且沒有進度的概念,比如說,你拷貝一個很大的文件,一直在拷貝,你不知道已經拷貝到哪了,已經等不及了,就把它給停掉了,這樣就造成之前的拷貝白白浪費了。
因此采取文件流的方式復制,就是針對大文件操作的
2.文件流操作方式
獲取文件信息
通過異步模式獲取文件信息的語法格式:
fs.stat(path, callback)
參數
參數使用說明如下:
-
path - 文件路徑。
-
callback - 回調函數,帶有兩個參數如:(err, stats), stats 是 fs.Stats 對象。
fs.stat(path)執行后,會將stats類的實例返回給其回調函數。可以通過stats類中的提供方法判斷文件的相關屬性。
//文件流的方式復制 const fs=require('fs'); const path=require('path'); //創建文件的讀取流,並沒有讀出正式的數據,開始了讀取文件的任務 var reader=fs.createReadStream('D:\\nodejs\\03.txt'); //創建一個寫入流 var writer=fs.createWriteStream('D:\\nodejs\\04.txt'); fs.stat('D:\\nodejs\\01.txt',(err,stats)=>{ if(stats){//如果有stats,就說明文件存在 var readTotal=0; reader.on('data',(chunk)=>{ //chunk是一個buffer(字節數組),每次讀取的只是一小部分數據 writer.write(chunk,(err)=>{ console.log('寫的進度:'+((readTotal+=chunk.length)/stats.size*100)+'%');//可以查看進度 }); }); } });