亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Node.js Streams文件讀寫操作詳解

 更新時間:2016年07月04日 11:50:55   投稿:lijiao  
如果你在處理應用中 I/O 相關的操作,你可以利用 Node.js 中的流(stream),這篇文章主要為大家詳細介紹了Node.js Streams文件讀寫操作,感興趣的小伙伴們可以參考一下

Node.js 天生異步和事件驅動,非常適合處理 I/O 相關的任務。如果你在處理應用中 I/O 相關的操作,你可以利用 Node.js 中的流(stream)。因此,我們先具體看看流,理解一下它們是怎么簡化 I/O 操作的吧。 

流是什么
流是 unix 管道,讓你可以很容易地從數(shù)據(jù)源讀取數(shù)據(jù),然后流向另一個目的地。
簡單來說,流不是什么特別的東西,它只是一個實現(xiàn)了一些方法的 EventEmitter 。根據(jù)它實現(xiàn)的方法,流可以變成可讀流(Readable),可寫流(Writable),或者雙向流(Duplex,同時可讀可寫)。
可讀流能讓你從一個數(shù)據(jù)源讀取數(shù)據(jù),而可寫流則可以讓你往目的地寫入數(shù)據(jù)。
如果你已經(jīng)用過 Node.js,你很可能已經(jīng)遇到過流了。
例如,在一個 Node.js 的 HTTP 服務器里面, request 是一個可讀流, response 是一個可寫流。
你也可能用過 fs 模塊,它能幫你處理可讀可寫流。
 現(xiàn)在讓你學一些基礎,理解不同類型的流。本文會討論可讀流和可寫流,雙向流超出了本文的討論范圍,我們不作討論。
 可讀流 (Readable Streams)
 我們可以用可讀流從一個數(shù)據(jù)源中讀取數(shù)據(jù),這個數(shù)據(jù)源可以是任何東西,例如系統(tǒng)中的一個文件,內(nèi)存中的 buffer,甚至是其他流。因為流是 EventEmitter ,它們會用各種事件發(fā)送數(shù)據(jù)。我們會利用這些事件來讓流工作。

從流中讀取數(shù)據(jù)
 從流中讀取數(shù)據(jù)最好的方式是監(jiān)聽 data 事件,添加一個回調(diào)函數(shù)。當有數(shù)據(jù)流過來的時候,可讀流會發(fā)送 data 事件,回調(diào)函數(shù)就會觸發(fā)??纯聪旅娴拇a片段:

 var fs = require('fs');
var readableStream = fs.createReadStream('file.txt');
var data = '';

var readableStream.on('data', function(chunk){
 data += chunk;
});

readableStream.on('end', function(){
 console.log(data);
});
 

fs.createReadStream 會給你一個可讀流。
最開始的時候,這個流不是流動態(tài)的。當你添加了 data 的事件監(jiān)聽器,加上一個回調(diào)函數(shù)時,它才會變成流動態(tài)的。在這之后,它就會讀取一小塊數(shù)據(jù),然后傳到你的回調(diào)函數(shù)里面。
流的實現(xiàn)者決定了 data 事件的觸發(fā)頻率,例如 HTTP request 會在讀取到幾 KB 數(shù)據(jù)的時候觸發(fā) data 事件。 當你從一個文件中讀取數(shù)據(jù)的時候,你可能會決定當一行被讀完的時候就觸發(fā) data 事件。
當沒有數(shù)據(jù)可讀的時候 (讀到文件尾部時),流就會發(fā)送 end 事件。在上面的例子中,我們監(jiān)聽了這個事件,當讀完文件的時候,就把數(shù)據(jù)打印出來。
還有另一種讀取流的方式,你只要在讀到文件尾部前不斷調(diào)用流實例中的 read() 方法就可以了。

 var fs = require('fs');
var readableStream = fs.createReadStream('file.txt');
var data = '';
var chunk;

readableStream.on('readable', function(){
 while ((chunk = readableStream.read()) != null) {
 data += chunk;
 }
});

readableStream.on('end', function(){
 console.log(data);
});

read() 方法會從內(nèi)部 buffer 中讀取數(shù)據(jù),當沒有數(shù)據(jù)可讀的時候,它會返回 null 。
因此,在 while 循環(huán)中我們檢查 read() 是不是返回 null ,當它返回 null 的時候,就終止循環(huán)。
需要注意的是,當我們可以從流中讀取數(shù)據(jù)的時候, readable 事件就會觸發(fā)。
設置編碼
默認情況下,你從流中讀取到的是 Buffer 對象。如果你要讀取的是字符串的話,這并不適合你。因此,你可以像下面的例子那樣通過調(diào)用 Readable.setEncoding() 來設置流的編碼:

 var fs = require('fs');
var readableStream = fs.createReadStream('file.txt');
var data = '';

readableStream.setEncoding('utf8');

readableStream.on('data', function(chunk){
 data += chunk;
});

readableStream.on('end', function(){
 console.log(data);
});

上面的例子中,我們把流的編碼設置成 utf8 ,數(shù)據(jù)就會被解析成 utf8 ,回調(diào)函數(shù)中的 chunk 就會是字符串了。
管道 (Piping)
管道是一個很棒的機制,你不需要自己管理流的狀態(tài)就可以從數(shù)據(jù)源中讀取數(shù)據(jù),然后寫入到目的地中。我們先看看下面的例子:

 var fs = require('fs');
var readableStream = fs.createReadStream('file1.txt');
var writableStream = fs.createWriteStream('file2.txt');

readableStream.pipe(writableStream);

上面的例子利用 pipe() 方法把 file1 的內(nèi)容寫到 file2 中。因為 pipe() 會幫你管理數(shù)據(jù)流,你不需要擔心數(shù)據(jù)流的速度。這讓 pipe() 變得非常簡潔易用。
需要注意的是, pipe() 會返回目的地的流,因此你可以很輕易讓多個流鏈接起來!
鏈接 (Chaining)
假設有一個歸檔文件,你想要解壓它。有很多方式可以完成這個任務。但最簡潔的方式是利用管道和鏈接:

 var fs = require('fs');
var zlib = require('zlib');

fs.createReadStream('input.txt.gz')
 .pipe(zlib.createGunzip())
 .pipe(fs.createWriteStream('output.txt'));

首先,我們通過 input.txt.gz 創(chuàng)建了一個可讀流,然后讓它流 zlib.createGunzip() 流,它會解壓內(nèi)容。最后,我們添加一個可寫流把解壓后的內(nèi)容寫到另一個文件中。
其他方法
 我們已經(jīng)討論了一些可讀流中重要的概念了,這里還有一些你需要知道的方法:
 1.Readable.pause() – 這個方法會暫停流的流動。換句話說就是它不會再觸發(fā) data 事件。
 2.Readable.resume() – 這個方法和上面的相反,會讓暫停流恢復流動。
 3.Readable.unpipe() – 這個方法會把目的地移除。如果有參數(shù)傳入,它會讓可讀流停止劉翔某個特定的目的地,否則,它會移除所有目的地。 

可寫流 (Writable Streams)
可寫流讓你把數(shù)據(jù)寫入目的地。就像可讀流那樣,這些也是 EventEmitter ,它們也會觸發(fā)不同的事件。我們來看看可寫流中會觸發(fā)的事件和方法吧。
寫入流 
要把數(shù)據(jù)寫如到可寫流中,你需要在可寫流實例中調(diào)用 write() 方法,看看下面的例子:

 var fs = require('fs');
var readableStream = fs.createReadStream('file1.txt');
var writableStream = fs.createWriteStream('file2.txt');

readableStream.setEncoding('utf8');

readableStream.on('data', function(chunk){
 writableStream.write('chunk');
});

上面的代碼非常簡單,它只是從輸入流中讀取數(shù)據(jù),然后用 write() 寫入到目的地中。
 這個方法返回一個布爾值來表示寫入是否成功。如果返回的是 true 那表示寫入成功,你可以繼續(xù)寫入更多的數(shù)據(jù)。 如果是 false ,那意味著發(fā)生了什么錯誤,你現(xiàn)在不能繼續(xù)寫入了??蓪懥鲿|發(fā)一個 drain 事件來告訴你你可以繼續(xù)寫入數(shù)據(jù)。
 寫完數(shù)據(jù)后
 當你不需要在寫入數(shù)據(jù)的時候,你可以調(diào)用 end() 方法來告訴流你已經(jīng)完成寫入了。假設 res 是一個 HTTP response 對象,你通常會發(fā)送響應給瀏覽器:
res.write('Some Data!!');
res.end();
當 end() 被調(diào)用時,所有數(shù)據(jù)會被寫入,然后流會觸發(fā)一個 finish 事件。注意在調(diào)用 end() 之后,你就不能再往可寫流中寫入數(shù)據(jù)了。例如下面的代碼就會報錯:
res.write('Some Data!!');
res.end();
res.write('Trying to write again'); //Error !
這里有一些和可寫流相關的重要事件:
 1.error – 在寫入或鏈接發(fā)生錯誤時觸發(fā)
 2.pipe – 當可讀流鏈接到可寫流時,這個事件會觸發(fā)
 3.unpipe – 在可讀流調(diào)用 unpipe 時會觸發(fā)

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Nodejs做文本數(shù)據(jù)處理實現(xiàn)詳解

    Nodejs做文本數(shù)據(jù)處理實現(xiàn)詳解

    這篇文章主要為大家介紹了Nodejs做文本數(shù)據(jù)處理實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 詳解nodejs解壓版安裝和配置(帶有搭建前端項目腳手架)

    詳解nodejs解壓版安裝和配置(帶有搭建前端項目腳手架)

    這篇文章主要介紹了詳解nodejs解壓版安裝和配置(帶有搭建前端項目腳手架) ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Node.js常用工具之util模塊

    Node.js常用工具之util模塊

    util是一個Node.js核心模塊,提供常用函數(shù)的集合,用于彌補JavaScript的功能的不足,util模塊設計的主要目的是為了滿足Node內(nèi)部API的需求。下面這篇文章將詳細的介紹關于Node.js常用工具之util模塊的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • nodejs和php實現(xiàn)圖片訪問實時處理

    nodejs和php實現(xiàn)圖片訪問實時處理

    這篇文章主要為大家詳細介紹了nodejs和php分別實現(xiàn)圖片訪問實時處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Express實現(xiàn)Session身份認證的示例代碼

    Express實現(xiàn)Session身份認證的示例代碼

    本文主要介紹了Express實現(xiàn)Session身份認證的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • nodejs 中模擬實現(xiàn) emmiter 自定義事件

    nodejs 中模擬實現(xiàn) emmiter 自定義事件

    這篇文章主要介紹了Nodejs中自定義事件實例,比較簡單的一個例子,需要的朋友可以參考下。
    2016-02-02
  • 基于Node.js的強大爬蟲 能直接發(fā)布抓取的文章哦

    基于Node.js的強大爬蟲 能直接發(fā)布抓取的文章哦

    基于Node.js的強大爬蟲能直接發(fā)布抓取的文章哦!本爬蟲源碼基于WTFPL協(xié)議,感興趣的小伙伴們可以參考一下
    2016-01-01
  • node獲取客戶端ip功能簡單示例

    node獲取客戶端ip功能簡單示例

    這篇文章主要介紹了node獲取客戶端ip功能,結合實例形式分析了node.js獲取客戶端IP地址的原理與實現(xiàn)方法,需要的朋友可以參考下
    2019-08-08
  • Node.js進程管理之子進程詳解

    Node.js進程管理之子進程詳解

    本文詳細講解了Node.js進程管理之子進程,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • nodejs使用PassThrough流進行數(shù)據(jù)傳遞合并示例詳解

    nodejs使用PassThrough流進行數(shù)據(jù)傳遞合并示例詳解

    這篇文章主要為大家介紹了nodejs使用PassThrough流進行數(shù)據(jù)傳遞合并示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09

最新評論