stream
?模塊的作用
在 Node.js 中,
stream
模塊是一個用于處理流(stream)的核心模塊。流是一種處理數據的抽象方式,允許程序處理大量數據時不會一次性將所有數據加載到內存中,從而提高性能和內存效率。通過流,Node.js 可以以分塊的方式讀取和寫入數據,這對于處理大文件或實時數據流(如音視頻流、網絡請求等)非常有效。
流可以分為以下幾種類型:
- Readable Streams:可讀流,允許從某個數據源中讀取數據(例如,文件、HTTP 響應、標準輸入等)。
- Writable Streams:可寫流,允許將數據寫入某個目標(例如,文件、HTTP 請求、標準輸出等)。
- Duplex Streams:雙工流,既可以讀也可以寫(例如,網絡通信中的 TCP 套接字)。
- Transform Streams:轉換流,既可以讀也可以寫,但在讀取數據時,會在讀取的數據上執行一些轉換操作(例如,壓縮、加密、解密等)。
核心功能和概念
-
數據流的處理方式:
- 流是按塊(chunk)進行傳輸的,避免了將所有數據一次性加載到內存中的問題。這使得在處理大數據時,程序能夠以非常高效的方式進行工作。
- 流會自動地分配緩沖區,這些緩沖區的大小可以根據需求進行調節。
-
事件驅動:
- 流是基于事件驅動的。當數據可用時,會觸發事件。常見的事件有?
data
、end
、error
?和?finish
?等。
- 流是基于事件驅動的。當數據可用時,會觸發事件。常見的事件有?
-
管道操作:
- Node.js 的?
stream
?模塊支持管道(pipe)操作。你可以將一個流的輸出連接到另一個流的輸入,這樣數據就能自動從一個流傳輸到另一個流,而不需要手動處理每個數據塊。 stream.pipe()
?是常用的流連接方法。
- Node.js 的?
stream
?模塊相關的API
1、Readable Stream(可讀流)
- 用途:用于從數據源中讀取數據。
- 常見使用場景:讀取文件、HTTP 請求響應、標準輸入等。
const fs = require('fs');
const readableStream = fs.createReadStream('example.txt', { encoding: 'utf8' });readableStream.on('data', (chunk) => {console.log('Received chunk:', chunk);
});readableStream.on('end', () => {console.log('No more data.');
});readableStream.on('error', (err) => {console.error('Error:', err);
});
當讀取一個文件時,打印的格式是以下這樣的
2、Writable Stream(可寫流)
- 用途:用于向某個目標寫入數據。
- 常見使用場景:寫入文件、HTTP 請求的響應、標準輸出等。
const fs = require('fs');
const writableStream = fs.createWriteStream('output.txt');writableStream.write('Hello, world!\n');
writableStream.end(); // 完成寫入writableStream.on('finish', () => {console.log('Writing completed!');
});writableStream.on('error', (err) => {console.error('Error:', err);
});
3、Duplex Stream(雙工流)
- 用途:可以同時讀取和寫入的流。
- 常見使用場景:例如,網絡通信中的 TCP 套接字。
const { Duplex } = require('stream');const duplexStream = new Duplex({read(size) {this.push('data from read\n');this.push(null); // 結束流},write(chunk, encoding, callback) {console.log('Received chunk:', chunk.toString());callback();}
});duplexStream.write('Hello, Duplex stream!\n');
duplexStream.pipe(process.stdout);
4、Transform Stream(轉換流)
- 用途:用于在讀取數據時,對數據進行某種轉換(例如,壓縮、解密等)。
- 常見使用場景:壓縮文件、數據加密等。
const { Transform } = require('stream');const transformStream = new Transform({transform(chunk, encoding, callback) {this.push(chunk.toString().toUpperCase()); // 轉換成大寫callback();}
});process.stdin.pipe(transformStream).pipe(process.stdout);
主要方法和事件
常用方法:
stream.read([size])
:從流中讀取數據,size
?參數控制每次讀取的字節數。stream.write(chunk[, encoding][, callback])
:向流中寫入數據。stream.end([chunk][, encoding][, callback])
:標記流的結束,通常在寫入完畢后調用。stream.pipe(destination)
:將當前流的輸出傳遞到目標流(即另一個流)。
常用事件:
'data'
:當可讀取的數據時觸發。'end'
:數據讀取完畢時觸發(在可讀流中)。'finish'
:數據寫入完畢時觸發(在可寫流中)。'error'
:流操作中發生錯誤時觸發。