Stream 介紹
Stream 是一個抽象介面,Node 中有很多物件實現了這個介面。例如,對http 伺服器發起請求的request 物件就是一個 Stream,還有stdout(標準輸出)。往往用於開啟大型的文字檔案,建立一個讀取操作的資料流。所謂大型文字檔案,指的是文字檔案的體積很大,讀取操作的快取裝不下,只能分成幾次傳送,每次傳送會觸發一個data事件,傳送結束會觸發end事件。
讀取流
var fs = require("fs");
var data = ``;
// 建立可讀流
var readerStream = fs.createReadStream(`input.txt`);
// console.log(readerStream);
// 設定編碼為 utf8。
readerStream.setEncoding(`UTF8`);
// 處理流事件 --> data, end, and error
readerStream.on(`data`, function(chunk) {
data += chunk;
});
readerStream.on(`end`,function(){
console.log(data);
});
readerStream.on(`error`, function(err){
console.log(err.stack);
});
console.log("程式執行完畢");
寫入流
建立一個可以寫入的流,寫入到檔案 output.txt 中
var fs = require("fs");
var data = `中國`;
// 建立一個可以寫入的流,寫入到檔案 output.txt 中
// var writerStream = fs.createWriteStream(`output.txt`, {`flags`: `a`}); //追加文字
var writerStream = fs.createWriteStream(`output.txt`);
// 使用 utf8 編碼寫入資料
writerStream.write(data,`UTF8`);
// 標記檔案末尾
writerStream.end();
// 處理流事件 --> data, end, and error
writerStream.on(`finish`, function() {
console.log("寫入完成。");
});
writerStream.on(`error`, function(err){
console.log(err.stack);
});
console.log("程式執行完畢");
管道流
<img src=”https://sfault-image.b0.upaiy…; height = “300” />
管道提供了一個輸出流到輸入流的機制。通常我們用於從一個流中獲取資料並將資料傳遞到另外一個流中。我們把檔案比作裝水的桶,而水就是檔案裡的內容,我們用一根管子(pipe)連線兩個桶使得水從一個桶流入另一個桶,這樣就慢慢的實現了大檔案的複製過程。以下例項我們通過讀取一個檔案內容並將內容寫入到另外一個檔案中。
var fs = require("fs");
// 建立一個可讀流
var readerStream = fs.createReadStream(`input.txt`);
// 建立一個可寫流
// {`flags`: `a`}//追加文字
var writerStream = fs.createWriteStream(`output.txt`);
// 管道讀寫操作
// 讀取 input.txt 檔案內容,並將內容寫入到 output.txt 檔案中
readerStream.pipe(writerStream);
console.log("程式執行完畢");
鏈式流
鏈式是通過連線輸出流到另外一個流並建立多個對個流操作鏈的機制。鏈式流一般用於管道操作。接下來我們就是用管道和鏈式來壓縮和解壓檔案。
壓縮
var fs = require("fs");
//壓縮和解壓的模組
var zlib = require(`zlib`);
// 壓縮 input.txt 檔案為 input.txt.gz
// 以流的方式讀取文字
fs.createReadStream(`input.txt`)
.pipe(zlib.createGzip()) //把讀取出來的文字呼叫壓縮模組進行壓縮
.pipe(fs.createWriteStream(`input.zip`));//把壓縮好的流進行儲存
console.log("檔案壓縮完成。");
解壓
var fs = require("fs");
//壓縮和解壓的模組
var zlib = require(`zlib`);
fs.createReadStream(`input.zip`)
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream(`input1.txt`));
console.log("檔案解壓完成。")