使用流讀文件寫文件處理大文件

處理大文件讀寫 流stream

  • fs.createReadStream

createReadStream 是fs模塊裏面讀流的一個方法javascript

createReadStream 讀取文件,有兩個參數
第一個參數,讀取文件的路徑
第二個參數 highWaterMark 最高水位線,默認最多讀取64K
讀取的類容都是buffer類型
返回的結果是一個可讀流的實例,是非流動模式---咱們最後要轉爲流動模式
先要定義一下咱們讀流的變量,假設咱們有一個1.txt文件,咱們要讀取1.txt裏面的類容
咱們先設置最高水位線每次讀取1k
let rs=fs.createReadStream('./1.txt',{highWaterMark:1})java

咱們的rs裏面有綁定了兩個事件方法data和end數組

  • fs.createWriteStream
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("沒有改文件")
      }
  
    })
  
  }
相關文章
相關標籤/搜索