Artikel ini akan memberi anda pemahaman terperinci tentang modul strim dalam Nodejs, dan memperkenalkan konsep dan penggunaan strim saya harap ia akan membantu semua orang.
modul strim ialah modul yang sangat teras dalam Nod Modul lain seperti fs, http, dsb. semuanya berdasarkan kejadian modul strim .
Bagi kebanyakan pemula front-end, apabila mereka mula-mula mula menggunakan Node, mereka masih tidak mempunyai pemahaman yang jelas tentang konsep dan penggunaan strim, kerana nampaknya terdapat sangat sedikit tentang "strim" dalam kerja bahagian hadapan Mengendalikan aplikasi berkaitan.
Dengan perkataan "aliran" sahaja, kita boleh dengan mudah mempunyai konsep aliran air, aliran, dsb.
Takrifan rasmi: Strim ialah antara muka abstrak untuk memproses data aliran dalam Node.js
Daripada takrifan rasmi, kita boleh lihat:
Pemahaman aliran yang tepat, Ia boleh difahami sebagai 数据流
, iaitu satu cara untuk menghantar data Dalam aplikasi, aliran adalah aliran data yang teratur dengan titik permulaan dan titik akhir.
Sebab utama mengapa kami tidak memahami aliran dengan baik ialah ia adalah konsep abstrak.
Untuk kami memahami dengan jelas modul strim, kami terlebih dahulu menerangkan aplikasi praktikal modul strim dengan senario aplikasi tertentu.
strim, dalam Node, digunakan terutamanya untuk 大量数据
keperluan pemprosesan, seperti fs membaca dan menulis fail besar, respons permintaan http, pemampatan fail, penyulitan/penyahsulitan data dan aplikasi lain .
Kami menggunakan gambar di atas untuk menggambarkan penggunaan aliran baldi boleh difahami sebagai 数据源
, kolam boleh difahami sebagai 数据目标
, dan paip. disambungkan di tengah boleh difahami sebagai 数据流
, melalui 数据流管道
, data mengalir dari sumber data ke sasaran data.
Dalam Nod, strim dibahagikan kepada 4 kategori: strim boleh dibaca, strim boleh tulis, strim dupleks dan strim penukaran.
Writable
: Strim ke mana data boleh ditulis Readable
: Strim ke mana data boleh dimasukkan baca Duplex
: Aliran Readable
dan Writable
Transform
: boleh diubah suai semasa menulis dan membaca data atau Duplex
strim yang mengubah data Semua strim ialah tika EventEmitter
. Iaitu, kita boleh memantau perubahan dalam aliran data melalui mekanisme acara.
Sebelum mempelajari penggunaan khusus 4 jenis aliran, kita perlu memahami dua konsep 数据模式
dan 缓存区
, yang akan membantu kita dalam langkah seterusnya. Pemahaman yang lebih baik melalui pembelajaran hiliran.
4.1 Mod Data
Semua strim yang dibuat oleh Node.js API hanya untuk 字符串
dan Buffer
(atau Uint8Array
) objek untuk beroperasi.
4.2 Penampan
Writable
dan Readable
menstrim kedua-dua menyimpan data dalam penimbal dalaman.
Jumlah data yang boleh ditimbal bergantung pada pilihan highWaterMark
yang dihantar kepada pembina strim Untuk strim biasa, pilihan highWaterMark
menentukan 字节的总数
untuk strim yang beroperasi dalam mod objek, pilihan highWaterMark
menentukan Jumlah bilangan objek. Pilihan
highWaterMark
ialah ambang, bukan had: ia menentukan jumlah data yang ditampan oleh strim sebelum ia berhenti meminta lebih banyak data.
Apabila pelaksanaan memanggil stream.push(chunk)
, data dicache dalam strim Readable
. Jika pengguna strim tidak memanggil stream.read()
, data akan kekal dalam baris gilir dalaman sehingga digunakan.
Setelah jumlah saiz penimbal bacaan dalaman mencapai ambang yang ditentukan oleh highWaterMark
strim akan menghentikan sementara membaca data daripada sumber asas sehingga data yang ditimbal pada masa ini boleh digunakan
Apabila diulang Apabila memanggil kaedah writable.write(chunk)
, data akan dicache dalam strim Writable
.
5.1 Aliran dan jeda bacaan strim
Readable
Terdapat dua jenis aliran Berkesan beroperasi dalam salah satu mod: aliran dan jeda.
Mod aliran: Baca data dari lapisan bawah sistem dan tolak() ke kawasan cache Selepas mencapai highWaterMark, push() akan mengembalikan palsu, dan sumber akan berhenti mengalir ke kawasan cache, dan penggunaan peristiwa data akan dicetuskan.
Mod Jeda: Semua strim Boleh Baca bermula dalam mod Jeda Dijeda dan kaedah stream.read() mesti dipanggil secara eksplisit untuk membaca data daripada strim. Setiap kali data mencapai kawasan penimbal, peristiwa boleh dibaca akan dicetuskan, iaitu, setiap push() akan mencetuskan boleh dibaca.
Cara menukar daripada mod jeda kepada mod aliran:
Cara menukar mod aliran kepada mod jeda:
5.2 Contoh biasa strim boleh dibaca
import path from 'path'; import fs, { read } from 'fs'; const filePath = path.join(path.resolve(), 'files', 'text.txt'); const readable = fs.createReadStream(filePath); // 如果使用 readable.setEncoding() 方法为流指定了默认编码,则监听器回调将把数据块作为字符串传入;否则数据将作为 Buffer 传入。 readable.setEncoding('utf8'); let str = ''; readable.on('open', (fd) => { console.log('开始读取文件') }) // 每当流将数据块的所有权移交给消费者时,则会触发 'data' 事件 readable.on('data', (data) => { str += data; console.log('读取到数据') }) // 方法将导致处于流动模式的流停止触发 'data' 事件,切换到暂停模式。 任何可用的数据都将保留在内部缓冲区中。 readable.pause(); // 方法使被显式暂停的 Readable 流恢复触发 'data' 事件,将流切换到流动模式。 readable.resume(); // 当调用 stream.pause() 并且 readableFlowing 不是 false 时,则会触发 'pause' 事件。 readable.on('pause', () => { console.log('读取暂停') }) // 当调用 stream.resume() 并且 readableFlowing 不是 true 时,则会触发 'resume' 事件。 readable.on('resume', () => { console.log('重新流动') }) // 当流中没有更多数据可供消费时,则会触发 'end' 事件。 readable.on('end', () => { console.log('文件读取完毕'); }) // 当流及其任何底层资源(例如文件描述符)已关闭时,则会触发 'close' 事件。 readable.on('close', () => { console.log('关闭文件读取') }) // 将 destWritable 流绑定到 readable,使其自动切换到流动模式并将其所有数据推送到绑定的 Writable。 数据流将被自动管理 readable.pipe(destWriteable) // 如果底层流由于底层内部故障而无法生成数据,或者当流实现尝试推送无效数据块时,可能会发生这种情况。 readable.on('error', (err) => { console.log(err) console.log('文件读取发生错误') })
6.1 Aliran dan penggantungan strim boleh tulis Strim boleh tulis adalah serupa dengan strim boleh dibaca Apabila data mengalir, ia akan ditulis terus ke Kawasan cache, apabila kelajuan menulis perlahan atau penulisan digantung, aliran data akan dicache di kawasan penimbal
Apabila pengeluar menulis terlalu cepat dan mengisi kolam baris gilir, ia akan muncul. Tekanan belakang", pada masa ini, anda perlu memberitahu pengeluar untuk menggantung pengeluaran. Apabila baris gilir dilepaskan, strim boleh tulis akan menghantar mesej longkang kepada pengeluar untuk menyambung semula pengeluaran.
6.2 Contoh Strim Boleh Tulis
Untuk lebih banyak pengetahuan berkaitan nod, sila lawati:import path from 'path'; import fs, { read } from 'fs'; const filePath = path.join(path.resolve(), 'files', 'text.txt'); const copyFile = path.join(path.resolve(), 'files', 'copy.txt'); let str = ''; // 创建可读流 const readable = fs.createReadStream(filePath); // 如果使用 readable.setEncoding() 方法为流指定了默认编码 readable.setEncoding('utf8'); // 创建可写流 const wirteable = fs.createWriteStream(copyFile); // 编码 wirteable.setDefaultEncoding('utf8'); readable.on('open', (fd) => { console.log('开始读取文件') }) // 每当流将数据块的所有权移交给消费者时,则会触发 'data' 事件 readable.on('data', (data) => { str += data; console.log('读取到数据'); // 写入 wirteable.write(data, 'utf8'); }) wirteable.on('open', () => { console.log('开始写入数据') }) // 如果对 stream.write(chunk) 的调用返回 false,则 'drain' 事件将在适合继续将数据写入流时触发。 // 即生产数据的速度大于写入速度,缓存区装满之后,会暂停生产着从底层读取数据 // writeable缓存区释放之后,会发送一个drain事件让生产者继续读取 wirteable.on('drain', () => { console.log('继续写入') }) // 在调用 stream.end() 方法之后,并且所有数据都已刷新到底层系统,则触发 'finish' 事件。 wirteable.on('finish', () => { console.log('数据写入完毕') }) readable.on('end', () => { // 数据读取完毕通知可写流 wirteable.end() }) // 当在可读流上调用 stream.pipe() 方法将此可写流添加到其目标集时,则触发 'pipe' 事件。 // readable.pipe(destWriteable) wirteable.on('pipe', () => { console.log('管道流创建') }) wirteable.on('error', () => { console.log('数据写入发生错误') })
Atas ialah kandungan terperinci Mari bercakap tentang modul teras dalam Nodejs: modul strim (lihat cara menggunakannya). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!