9、Node.js Stream(流)

来源:https://www.cnblogs.com/-nbloser/archive/2018/06/07/9148908.html
-Advertisement-
Play Games

#########################################################################介紹Node.js Stream(流)Stream 是一個抽象介面,Node 中有很多對象實現了這個介面。例如,對http 伺服器發起請求的request ...



#########################################################################介紹
Node.js Stream(流)
Stream 是一個抽象介面,Node 中有很多對象實現了這個介面。例如,對http 伺服器發起請求的request 對象就是一個 Stream,還有stdout(標準輸出)。
Node.js,Stream 有四種流類型:
    • Readable - 可讀操作。
    • Writable - 可寫操作。
    • Duplex - 可讀可寫操作.
    • Transform - 操作被寫入數據,然後讀出結果。
所有的 Stream 對象都是 EventEmitter 的實例。常用的事件有:
    • data - 當有數據可讀時觸發。
    • end - 沒有更多的數據可讀時觸發。
    • error - 在接收和寫入過程中發生錯誤時觸發。
    • finish - 所有數據已被寫入到底層系統時觸發。


#############################################################################
從流中讀取數據
read_source.txt:love A
####main.js

var fs = require('fs');
var data = '';
// 創建可讀流
var readStream = fs.createReadStream('read_source.txt');

// 設置編碼為 utf8
readStream.setEncoding('UTF8');

// 處理流事件 --> data, end, and error
readStream.on('data', function (chunk) {
    data += chunk;
});

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

readStream.on('error', function (err) {
    console.log(err.stack)
});

console.log('程式執行完畢');

執行結果:
程式執行完畢
love A


#############################################################################
寫入流

var fs = require('fs');
var data = 'love A';

// 創建寫入流,寫入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt');

// 使用 utf8 編碼寫入數據
writerStream.write(data, 'utf8');

// 標記文件末尾
writerStream.end();

// 處理流事件 --> finish and error
writerStream.on('finish', function () {
    console.log('寫入完畢');
});

writerStream.on('error', function (err) {
    console.log(err.stack);
});

console.log('程式執行完畢');

執行結果:
程式執行完畢
寫入完畢

###註意
創建寫入流的時候,文件存在會覆蓋原來文件。後面的例子也一樣,是文件的部分,現在還沒有學到那裡,如果需要如何追加內容,按照Java的思路查找api文檔

 

#############################################################################
管道流
管道提供了一個輸出流到輸入流的機制。通常我們用於從一個流中獲取數據並將數據傳遞到另外一個流中。

如上面的圖片所示,我們把文件比作裝水的桶,而水就是文件里的內容,我們用一根管子(pipe)連接兩個桶使得水從一個桶流入另一個桶,這樣就慢慢的實現了大文件的複製過程。
以下實例我們通過讀取一個文件內容並將內容寫入到另外一個文件中。

####實例

var fs = require('fs');

var readStream = fs.createReadStream('read_source.txt');
var writerStream = fs.createWriteStream('output2.txt');

// 管道讀寫操作
// 讀取 read_source.txt 文件內容,並將內容寫入到 output2.txt中
readStream.pipe(writerStream);

console.log('程式執行完畢');

 

 #############################################################################
鏈式流
鏈式是通過連接輸出流到另外一個流並創建多個流操作鏈的機制。鏈式流一般用於管道操作。
接下來我們就是用管道和鏈式來壓縮和解壓文件。
###壓縮
創建 compress.js 文件, 代碼如下:

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

// 壓縮 read_source.txt 成 read_source.txt.gz
var readStream = fs.createReadStream('read_source.txt');
var gzip = zlib.createGzip();
var writeStream = fs.createWriteStream('read_source.txt.gz');

readStream.pipe(gzip);
gzip.pipe(writeStream);

console.log('文件壓縮完成');



###解壓
執行完以上操作後,我們可以看到當前目錄下生成了 input.txt 的壓縮文件 input.txt.gz。
接下來,讓我們來解壓該文件,創建 decompress.js 文件,代碼如下:

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

// 解壓 read_source.txt.gz 成 depress.txt
var readStream = fs.createReadStream('read_source.txt.gz');
var gunzip = zlib.createGunzip();
var writeStream = fs.createWriteStream('depress.txt');

readStream.pipe(gunzip);
gunzip.pipe(writeStream);

console.log('文件解壓完成');

 


內容來自:http://www.runoob.com/nodejs/nodejs-stream.html    +我的學習理解

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • today,i'll using the open source tool named "binlog2sql" which is release by danfengchao to do some flashback test. here's the github address:https:// ...
  • 隨機查詢,方法可以有很多種。比如,查詢出所有記錄,然後隨機從列表中取n條記錄。使用程式便可實現。可是程式實現必須查詢出所有符合條件的記錄(至少是所有符合條件的記錄id),然後再隨機取出n個id,查詢資料庫。但是效率畢竟沒有資料庫中直接查詢得快。下麵介紹mysql中怎樣隨機查詢n條記錄。 1.最簡單的 ...
  • since i've broken down the replication enviornment by "reset master;" yesterday.therefore,i'd like to reconfigure it again,there're several simple ste ...
  • 效果: PagerData類: PagerFragment類: PagerActivity: fragment_pager: activity_pager: ...
  • 1、下麵測試截圖,基本過程就是:點擊按鈕向伺服器端發送請求,後臺收到請求後給出返回的數據,前臺只需要顯示服務端數據就可以了。例子很簡單能但引發很多思考,博主學了雜七雜八的,這又在來想雜學Android了?……其實是想多瞭解一下其他東西,畢竟博主還在上大學呀!多學點沒什麼不好…… 2、客戶端(Andr ...
  • 前言 作為一個稍微有點想法的程式員來說,擁有一個自己開發,自己運營,完全屬於自己的應用,應該是很多人的夢想。剛畢業那會,自己的工作是做游戲,於是也和朋友業餘時間開發一些小游戲玩玩,可是終究不成氣候,而且自己也只能做做單機小游戲。於是慢慢的也就失去了興趣,尤其是自己從游戲行業轉到app開發,對游戲也就 ...
  • 這兩天在GitHub上傳了一個自定義ViewPager: " CoolViewPager " ,具有以下功能特征: 1. 支持水平及垂直方向迴圈滾動 2. 支持自動滾動 3. 支持自動滾動方向、滾動時間、間隔時間的設置 4. 支持調用notifyDataSetChanged實時刷新界面 5. 支持邊 ...
  • java.net.UnknownHostException: Unable to resolve host "www.baidu.com": No address associated with hostname 錯誤原因:很明顯是連不上這台主機,百度功能變數名稱沒錯 解決方式:手機沒聯網(當然排除你是其他 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...