柚子快報邀請碼778899分享:【Node.js】流
柚子快報邀請碼778899分享:【Node.js】流
概念
流(Stream)是一種用于在節(jié)點(diǎn)(Node)之間傳輸數(shù)據(jù)的抽象概念。
它可以看作是一種連續(xù)的數(shù)據(jù)流,數(shù)據(jù)可以按照連續(xù)的塊(chunk)通過流從源(source)流向目的地(destination)。流可以是可讀的(Readable)或可寫的(Writable),也可以是可讀寫的(Duplex)。
Node.js 提供了 stream 模塊,它包含了用于創(chuàng)建、處理和管理流的各種類和方法。
當(dāng)然,在瀏覽器端,HTML5 提供了一些原生的流處理能力,如?ReadableStream?和?WritableStream。這些瀏覽器 API 允許通過網(wǎng)絡(luò)請求獲取數(shù)據(jù)的流式傳輸,而不是一次性獲取整個響應(yīng)。另外,瀏覽器端還可以使用?Blob?對象來處理文件流。
可讀流(Readable Stream):可讀流用于從數(shù)據(jù)源中讀取數(shù)據(jù)。例如,可以使用可讀流從文件系統(tǒng)中讀取文件、從網(wǎng)絡(luò)中接收數(shù)據(jù)、從標(biāo)準(zhǔn)輸入讀取用戶輸入等。可讀流的常見用法包括使用 fs.createReadStream() 創(chuàng)建文件讀取流、使用 http.IncomingMessage 對象獲取 HTTP 請求的可讀流。 可寫流(Writable Stream):可寫流用于將數(shù)據(jù)寫入目的地。例如,可以使用可寫流將數(shù)據(jù)寫入文件、將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)、將數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出等??蓪懥鞯某R娪梅òㄊ褂?fs.createWriteStream() 創(chuàng)建文件寫入流、使用 http.ServerResponse 對象發(fā)送 HTTP 響應(yīng)的可寫流。 雙工流(Duplex Stream):雙工流實(shí)現(xiàn)了同時可讀可寫的功能。它可以同時處理輸入和輸出流。例如,可以使用雙工流處理網(wǎng)絡(luò)通信中的數(shù)據(jù)讀取和寫入。 轉(zhuǎn)換流(Transform Stream):轉(zhuǎn)換流是一種特殊的雙工流,它可以對流中的數(shù)據(jù)進(jìn)行轉(zhuǎn)換。例如,可以使用轉(zhuǎn)換流進(jìn)行數(shù)據(jù)壓縮、加密、解密、格式轉(zhuǎn)換等操作。常見的轉(zhuǎn)換流包括 zlib.createGzip() 創(chuàng)建用于數(shù)據(jù)壓縮的流、crypto.createCipher() 創(chuàng)建用于數(shù)據(jù)加密的流等。
具體用法
數(shù)據(jù)轉(zhuǎn)換:流可以用于在數(shù)據(jù)傳輸?shù)倪^程中進(jìn)行轉(zhuǎn)換操作。通過使用轉(zhuǎn)換流(Transform Stream),我們可以對流中的數(shù)據(jù)進(jìn)行處理、轉(zhuǎn)換和過濾。常見的轉(zhuǎn)換操作包括數(shù)據(jù)壓縮(使用 zlib.createGzip() 創(chuàng)建壓縮流)、數(shù)據(jù)加密(使用 crypto.createCipher() 創(chuàng)建加密流)等。
例如,以下示例將一個文本文件壓縮并保存成新的文件:
const fs = require('fs');
const zlib = require('zlib');
const readableStream = fs.createReadStream('input.txt');
const gzipStream = zlib.createGzip();
const writableStream = fs.createWriteStream('output.txt.gz');
readableStream.pipe(gzipStream).pipe(writableStream);
在這個示例中,通過將可讀流連接到壓縮流,然后再連接到可寫流,實(shí)現(xiàn)了從輸入文件到輸出壓縮文件的流轉(zhuǎn)換。
大文件處理:使用流可以有效地處理大文件,而不需要將整個文件加載到內(nèi)存中。通過將文件讀取流連接到文件寫入流,可以逐塊地將大文件從源復(fù)制到目標(biāo)地。
例如,以下示例將一個大文件復(fù)制到新的文件:
const fs = require('fs');
const readableStream = fs.createReadStream('input.txt');
const writableStream = fs.createWriteStream('output.txt');
readableStream.pipe(writableStream);
這段代碼使用可讀流從 input.txt 文件中讀取數(shù)據(jù),并使用可寫流將數(shù)據(jù)寫入 output.txt 文件中。通過使用流,大文件可以逐塊地處理,減少了內(nèi)存占用。
網(wǎng)絡(luò)通信:流在網(wǎng)絡(luò)通信中也經(jīng)常被使用。在服務(wù)器端,可以使用可讀流讀取請求數(shù)據(jù),同時通過可寫流向客戶端發(fā)送響應(yīng)數(shù)據(jù)。在客戶端,同樣可以使用可讀流讀取服務(wù)器響應(yīng)數(shù)據(jù),通過可寫流將請求數(shù)據(jù)發(fā)送到服務(wù)器。
例如,以下示例使用 Node.js 的 http 模塊創(chuàng)建一個簡單的 Web 服務(wù)器,并將接收到的請求數(shù)據(jù)作為響應(yīng)返回給客戶端:
const http = require('http');
const server = http.createServer((req, res) => {
req.setEncoding('utf-8');
req.on('data', (chunk) => {
console.log(`Received data: ${chunk}`);
});
res.write('Hello, World!');
res.end();
});
server.listen(8080, () => {
console.log('Server is listening on port 8080');
});
在這個示例中,當(dāng)客戶端發(fā)送請求時,服務(wù)器會將請求的數(shù)據(jù)作為流式數(shù)據(jù)接收。在 data 事件處理程序中,我們可以對接收到的數(shù)據(jù)進(jìn)行處理。同時,服務(wù)器使用 write() 方法將響應(yīng)數(shù)據(jù)寫入可寫流,最后使用 end() 方法結(jié)束響應(yīng)。
柚子快報邀請碼778899分享:【Node.js】流
參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。