createReadStream 是fs模塊裏面讀流的一個方法javascript
createReadStream 讀取文件,有兩個參數
第一個參數,讀取文件的路徑
第二個參數 highWaterMark 最高水位線,默認最多讀取64K
讀取的類容都是buffer類型
返回的結果是一個可讀流的實例,是非流動模式---咱們最後要轉爲流動模式
先要定義一下咱們讀流的變量,假設咱們有一個1.txt文件,咱們要讀取1.txt裏面的類容
咱們先設置最高水位線每次讀取1k
let rs=fs.createReadStream('./1.txt',{highWaterMark:1})java
咱們的rs裏面有綁定了兩個事件方法data和end數組
const fs = require('fs'); const path = require('path'); let readPath = path.join(__dirname, `./dist/my.txt`); let copyPath = path.join(__dirname, './dist/my.txt'); // 實現每次讀取文件實時寫入 將新的buffer存入數組 而後轉成buffer save(`--:第2次加入:--`); async function save(value) { // 讀取文件 const localBufArr = await readFileStream(readPath); let totalLength = 0; // 添加新進入的buffer localBufArr.push( new Buffer(value,['utf8'])); localBufArr.map(v => { totalLength += v.length }) // buffer 合併 let buf = Buffer.concat(localBufArr, totalLength); // buffer合併 將數組buffer轉成整個buffer console.log('buf',buf); // 建立可寫流 let firstCreate = fs.createWriteStream(copyPath); // 寫入buffer firstCreate.write(buf); } // 讀文件 用流 function readFileStream(spath) { return new Promise((resolve, reject) => { // 判斷文件是否存在 if (fs.existsSync(spath)) { let readStream = fs.createReadStream(spath); let arr = []; let startTime = Date.now(); // 在內部不斷觸發rs.emit('data',數據);data不能更改,留動模式開啓後,數據會瘋狂觸發data事件 readStream.on('data', function (chunk) { //chunk是buffer類型 arr.push(chunk) }) // 監聽文件讀取完畢,會自動觸發一次end事件,沒有讀取完是不會觸發的 readStream.on('end', function (chunk) { let useTime = Date.now() - startTime; console.log("讀文件用" + (useTime/1000) +"s") resolve(arr) }) // 監聽錯誤 readStream.on('error', function (err) { console.log(err); }) } else { reject("沒有改文件") } }) }