NodeJS學習筆記 (28)流操做-stream(ok)

模塊概覽

nodejs的核心模塊,基本上都是stream的的實例,好比process.stdout、http.clientRequest。html

對於大部分的nodejs開發者來講,日常並不會直接用到stream模塊,只須要了解stream的運行機制便可(很是重要)。node

而對於想要實現自定義stream實例的開發者來講,就得好好研究stream的擴展API了,好比gulp的內部實現就大量用到了自定義的stream類型。git

來個簡單的例子鎮樓,幾行代碼就實現了讀取文件內容,並打印到控制檯:github

const fs = require('fs'); fs.createReadStream('./sample.txt').pipe(process.stdout);

Stream分類

在nodejs中,有四種stream類型:gulp

  • Readable:用來讀取數據,好比 fs.createReadStream()
  • Writable:用來寫數據,好比 fs.createWriteStream()
  • Duplex:可讀+可寫,好比 net.Socket()
  • Transform:在讀寫的過程當中,能夠對數據進行修改,好比 zlib.createDeflate()(數據壓縮/解壓)。

 

Readable Stream

如下都是nodejs中常見的Readable Stream,固然還有其餘的,可自行查看文檔。api

  • http.IncomingRequest
  • fs.createReadStream()
  • process.stdin
  • 其餘

例子一:ide

var fs = require('fs'); fs.readFile('./sample.txt', 'utf8', function(err, content){ // 文件讀取完成,文件內容是 [你好,我是程序猿小卡] console.log('文件讀取完成,文件內容是 [%s]', content); });

例子二:ui

var fs = require('fs'); var readStream = fs.createReadStream('./sample.txt'); var content = ''; readStream.setEncoding('utf8'); readStream.on('data', function(chunk){ content += chunk; }); readStream.on('end', function(chunk){ // 文件讀取完成,文件內容是 [你好,我是程序猿小卡] console.log('文件讀取完成,文件內容是 [%s]', content); });

例子三:spa

這裏使用了.pipe(dest),好處在於,若是源文件較大,對於下降內存佔用有好處。code

var fs = require('fs'); fs.createReadStream('./sample.txt').pipe(process.stdout);

注意:這裏只是原封不動的將內容輸出到控制檯,因此實際上跟前兩個例子有細微差別。能夠稍作修改,達到上面一樣的效果

var fs = require('fs'); var onEnd = function(){ process.stdout.write(']'); }; var fileStream = fs.createReadStream('./sample.txt'); fileStream.on('end', onEnd) fileStream.pipe(process.stdout); process.stdout.write('文件讀取完成,文件內容是['); // 文件讀取完成,文件內容是[你好,我是程序猿小卡]


Writable Stream

一樣以寫文件爲例子,好比想將hello world寫到sample.txt裏。

例子一:

var fs = require('fs'); var content = 'hello world'; var filepath = './sample.txt'; fs.writeFile(filepath, content);

例子二:

var fs = require('fs'); var content = 'hello world'; var filepath = './sample.txt'; var writeStram = fs.createWriteStream(filepath); writeStram.write(content); writeStram.end();


Duplex Stream

最多見的Duplex stream應該就是net.Socket實例了,在前面的文章裏有接觸過,這裏就直接上代碼了,這裏包含服務端代碼、客戶端代碼。

服務端代碼:

var net = require('net'); var opt = { host: '127.0.0.1', port: '3000' }; var client = net.connect(opt, function(){ client.write('msg from client'); // 可寫 }); // 可讀 client.on('data', function(data){ // server: msg from client [msg from client] console.log('client: got reply from server [%s]', data); client.end(); });

客戶端代碼:

var net = require('net'); var opt = { host: '127.0.0.1', port: '3000' }; var client = net.connect(opt, function(){ client.write('msg from client'); // 可寫 }); // 可讀 client.on('data', function(data){ // lient: got reply from server [reply from server] console.log('client: got reply from server [%s]', data); client.end(); });


Transform Stream

Transform stream是Duplex stream的特例,也就是說,Transform stream也同時可讀可寫。跟Duplex stream的區別點在於,Transform stream的輸出與輸入是存在相關性的。

常見的Transform stream包括zlibcrypto,這裏舉個簡單例子:文件的gzip壓縮。

var fs = require('fs'); var zlib = require('zlib'); var gzip = zlib.createGzip(); var inFile = fs.createReadStream('./extra/fileForCompress.txt'); var out = fs.createWriteStream('./extra/fileForCompress.txt.gz'); inFile.pipe(gzip).pipe(out);

相關連接

https://nodejs.org/api/stream.html

相關文章
相關標籤/搜索