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)+'%');//可以查看進度
});
});
}
});


