Node學習基礎(四)之文件的流操作以及pipe管道簡單舉例

 舉例說明:

// 1.引入模塊
let fs =require('fs');
//2.創建讀入流
let rs = fs.createReadStream('D:/Pictures/Saved Pictures/testSP.mp4');    //要讀取視頻的位置
let ws = fs.createWriteStream('testSP.mp4');        //視屏要寫入的位置,我這裏是默認的項目文件夾下的

//3.監聽流的打開和關閉
ws.once('open' ,()=>{
    console.log("讀入通道打開");
});
ws.once('close' ,()=>{
    console.log("讀入通道以關閉");
});

rs.once('open' ,()=>{
    console.log("寫出通道已打開");
});
rs.once('close' ,()=>{
    console.log("寫出通道已關閉");
});
//4.綁定data
rs.on("data", (data)=>{
    ws.write(data);
});

如上代碼 ,會把一個從本地通過流操作讀寫入項目

這個過程就是先引入模塊創建讀入 根據官網的文檔  格式就是這樣的  不懂的可以直接看node官方文檔 

這裏重點解釋一下 once,open,close和 on待會兒再說pipe管道

.once ('事件名‘,回調函數) ---相當於 bind,但是不會觸發 

.once ('事件名‘,function(){})

我們這裏傳入的就是open而且 fs.ReadStream準備好了   碰見open後觸發回調函數

Es6 語法就是.once('事件名',()=>{ }) 

.on(字符串event, 回調函數)

.on(event, listener)
爲指定事件註冊一個監聽器,接受一個字符串 event 和一個回調函數。

 所以遇見close就相當於關閉信號發出去了等待執行關閉

而碰見open就是WriteStream寫入流被觸發而進行寫入

結合官方文檔,我們可以把pipe方法的主要功能分解爲:

  • 不斷從來源可讀流中獲得一個指定長度的數據。
  • 將獲取到的數據寫入目標可寫流。
  • 平衡讀取和寫入速度,防止讀取速度大大超過寫入速度時,出現大量滯留數據。

每當在stream.pipe()可讀流上調用方法時,就會發出此消息,並將此可寫入添加到其目標集。

//官方文檔舉例
var writer = getWritableStreamSomehow();
var reader = getReadableStreamSomehow();
writer.on('pipe', (src) => {
  console.error('something is piping into the writer');
  assert.equal(src, reader);
});
reader.pipe(writer);

如果看不懂這個 我用剛纔的例子改變一下 你們就能理解了

// 1.引入模塊
let fs =require('fs');
var request = require('request');
//2.創建讀入流
let rs = fs.createReadStream('D:/Pictures/Saved Pictures/testSP.mp4');    //要讀取視頻的位置
let ws = fs.createWriteStream('testSP.mp4');        //視屏要寫入的位置

//創建管道
rs.pipe(ws);

 這裏和最上面的代碼對比 這裏從寫入位置之後就沒有那麼多繁瑣的代碼了 

而使用pipe的效果和最初的讀入效果完全一樣沒有任何區別 讀入的損失都無差距 

在這裏其實 stream.on 是有缺點的,這種方式是把文件內容全部讀入內存,然後再寫入文件,對於小型的文本文件,這沒有多大問題,比如 grunt-file-copy 就是這樣實現的。但是對於體積較大的二進制,比如音頻、視頻文件,動輒幾個GB大小,如果使用這種方法,很容易使內存“爆倉”。理想的方法應該是讀一部分,寫一部分,不管文件有多大,只要時間允許,總會處理完成,這裏就需要用到流的概念。

而使用pipe  會讀一部分,寫一部分,不管文件有多大,只要時間允許,總會處理完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章