nodejs中Stream的理解


在nodejs中可以通過fs模塊讀寫文件,我們來看下fs模塊提供的接口:

fs.readFile(filename, callback)

異步讀取文件。

filename是讀取文件的文件名,如果是相對路徑,則通過當前進程執行的路徑來查找文件。

回調函數有兩個參數callback(err, buffer)

第一個參數為err(如果沒有報錯,該參數值為null),進行操作時,應先判斷err是否有值。

第二個參數是代表文件內容的Buffer實例。

fs.writeFile(filename, content [, encode], callback)

異步寫入文件,content為寫入內容字符串, encode為編碼(默認utf8)

對應的cb回調函數中只有err一個參數(若無報錯為null);

 

這兩個方法有相應的同步版本:

fs.readFileSync(filename [,encode])

第二個參數可以是表示編碼的字符串,也可以是一個配置對象({encoding: null, flag: 'r'})

即默認編碼是null,讀取模式為r(只讀)。

如果不指定編碼方式,fs返回一個表示文件內容的Buffer實例,否則返回字符串。

fs.writeFileSync(filename, content, encode)

filename表示文件名,content是要寫入的字符串內容,encode是文件內容編碼方式。

通過這幾個接口我們可以完成簡單的文件讀寫工作:

var fs = require('fs');
var source = fs.readFileSync('/path/to/source', {encoding: 'utf8'});

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

上面幾個接口,無論是異步或是同步,都是等文件讀取完成,才進行操作的。

如果操作對象是一些小文件,這種操作沒有什么問題。

但是在服務器端,文件體積一般很龐大,用這種方式效率低下,導致線程阻塞,

甚至會因為內存不足而崩潰。

這里要引用Stream流的概念。

nodejs中Stream是EventEmitter的實現,你可以理解為在程序后台打開了一個文件(不占用主線程),

程序會一點一點的讀取(寫入)文件,通過事件和回調來完成文件的讀寫。來看個例子

var fs = require('fs');
// 創建一個可讀流
var readStream = fs.createReadStream('/path/to/source');
var writeStream = fs.createWriteStream('/path/to/dest');

readStream.on('data', function(chunk){
  // 可讀流收到data事件時,將內容寫入到可寫流
  writeStream.write(chunk);
});

readStream.on('end', function(){
  // 當可讀流讀取完成,會發出end事件,這時我們要把可寫流關閉
  writeStream.end();
});

當調用fs.createReadStream時,相當於創建了一個文件讀取流。

可以通過監聽data事件,來獲取讀取的部分數據,來進行一些操作。

也可以用pipe的寫法:

fs.createReadStream('/path/to/source')
  .pipe(fs.createWriteStream('/path/to/dest'))

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM