nodejs中流 stream 的理解

2021-07-11 22:38:34 字數 2559 閱讀 9832

nodejs的fs模組並沒有提供乙個copy的方法,但我們可以很容易的實現乙個,比如:

var source = fs.readfilesync('/path/to/source', );

fs.writefilesync('/path/to/dest', source);

如上面高大上的所示,我們把檔案比作裝水的桶,而水就是檔案裡的內容,我們用一根管子(pipe)連線兩個桶使得水從乙個桶流入另乙個桶,這樣就慢慢的實現了大檔案的複製過程。

stream在nodejs中是eventemitter的實現,並且有多種實現形式,例如:

上面的檔案複製可以簡單實現一下:

var fs = require('fs');

var readstream = fs.createreadstream('/path/to/source');

var writestream = fs.createwritestream('/path/to/dest');

readstream.on('data', function

(chunk)

);readstream.on('end', function

());

上面的寫法有一些問題,如果寫入的速度跟不上讀取的速度,有可能導致資料丟失。正常的情況應該是,寫完一段,再讀取下一段,如果沒有寫完的話,就讓讀取流先暫停,等寫完再繼續,於是**可以修改為:

var fs = require('fs');

var readstream = fs.createreadstream('/path/to/source');

var writestream = fs.createwritestream('/path/to/dest');

readstream.on('data', function

(chunk)

});writestream.on('drain', function

());

readstream.on('end', function

());

或者使用更直接的pipe

// pipe自動呼叫了data,end等事件

fs.createreadstream('/path/to/source').pipe(fs.createwritestream('/path/to/dest'));

下面是乙個更加完整的複製檔案的過程

var fs = require('fs'),

path = require('path'),

out = process.stdout;

var filepath = '/users/chen/movies/game.of.thrones.s04e07.1080p.hdtv.x264-batv.mkv';

var readstream = fs.createreadstream(filepath);

var writestream = fs.createwritestream('file.mkv');

var stat = fs.statsync(filepath);

var totalsize = stat.size;

var passedlength = 0;

var lastsize = 0;

var starttime = date.now();

readstream.on('data', function

(chunk)

});readstream.on('end', function

());

writestream.on('drain', function

());

settimeout(function

show

() else

}, 500);

可以把上面的**儲存為copy.js試驗一下

我們新增了乙個遞迴的settimeout(或者直接使用setinterval)來做乙個旁觀者,每500ms觀察一次完成進度,並把已完成的大小、百分比和複製速度一併寫到控制台上,當複製完成時,計算總的耗費時間,效果如圖:

我們複製了一集1080p的權利的遊戲第四季第7集,大概3.78g大小,由於使用了ssd,可以看到速度還是非常不錯的,哈哈哈~

複製完成後,顯示總花費時間

結合nodejs的readlineprocess.argv等模組,我們可以新增覆蓋提示、強制覆蓋、動態指定檔案路徑等完整的複製方法,有興趣的可以實現一下,實現完成,可以

ln -s /path/to/copy.js /usr/local/bin/mycopy
這樣就可以使用自己寫的mycopy命令替代系統的cp命令

Nodejs中流的操作

fs與流都可以處理檔案,為什麼還要用流 fs模組處理檔案的缺點 將檔案的資料全讀到記憶體中,在把資料寫到檔案內,會大量占用記憶體 流 流 stream 是 node.js 中處理流式資料的抽象介面,是一組有序的,有起點和終點的位元組資料傳輸手段。可以實現將資料從乙個地方流動到另乙個地方,其邊讀取邊寫...

nodeJS基礎 Stream用法

stream是nodejs的乙個核心模組,在nodejs中應用非常廣泛,比如http 伺服器request和response物件都是流 可讀流的用法 let fs require fs let path require path let rs fs.createreadstream path.joi...

了解nodeJs中的流(stream)

nodejs中的很多地方都用到了流,流是乙個很常見的概念,乙個http請求,控制台輸入輸出的形式都是流。流可以分為三種 可讀流 readable 可寫流 writable 既能讀又能寫 duplex 其中第三種流又可以分為全雙工流duplex和轉換流transform,另外,所有的流都是evente...