cari
Rumahhujung hadapan webtutorial jsMari bercakap tentang modul teras dalam Nodejs: modul strim (lihat cara menggunakannya)

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.

Mari bercakap tentang modul teras dalam Nodejs: modul strim (lihat cara menggunakannya)

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.

1. Aliran, apakah itu?

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:

  • Stream ialah alat yang disediakan oleh Node untuk memproses data
  • Stream ialah antara muka abstrak dalam Node

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.

2. Senario penggunaan strim khusus

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 .

Mari bercakap tentang modul teras dalam Nodejs: modul strim (lihat cara menggunakannya)

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.

3. Klasifikasi strim

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.

4. Mod data dan kawasan penimbal

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. Strim boleh dibaca

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:

    • Tambah pengendali acara data
    • Panggil kaedah stream.resume()
    • Panggil kaedah stream.pipe() untuk menghantar data ke Boleh Tulis
  • Cara menukar mod aliran kepada mod jeda:

    • Jika bukan sasaran Saluran Paip, dengan memanggil kaedah stream.pause().
    • Padam semua sasaran saluran paip jika ada. Sasaran saluran paip berbilang boleh dialih keluar dengan memanggil kaedah stream.unpipe().

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 🎜>

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('数据写入发生错误')
})
tutorial nodejs

! !

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!

Kenyataan
Artikel ini dikembalikan pada:掘金社区. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
JavaScript in Action: Contoh dan projek dunia nyataJavaScript in Action: Contoh dan projek dunia nyataApr 19, 2025 am 12:13 AM

Aplikasi JavaScript di dunia nyata termasuk pembangunan depan dan back-end. 1) Memaparkan aplikasi front-end dengan membina aplikasi senarai TODO, yang melibatkan operasi DOM dan pemprosesan acara. 2) Membina Restfulapi melalui Node.js dan menyatakan untuk menunjukkan aplikasi back-end.

JavaScript dan Web: Fungsi teras dan kes penggunaanJavaScript dan Web: Fungsi teras dan kes penggunaanApr 18, 2025 am 12:19 AM

Penggunaan utama JavaScript dalam pembangunan web termasuk interaksi klien, pengesahan bentuk dan komunikasi tak segerak. 1) kemas kini kandungan dinamik dan interaksi pengguna melalui operasi DOM; 2) pengesahan pelanggan dijalankan sebelum pengguna mengemukakan data untuk meningkatkan pengalaman pengguna; 3) Komunikasi yang tidak bersesuaian dengan pelayan dicapai melalui teknologi Ajax.

Memahami Enjin JavaScript: Butiran PelaksanaanMemahami Enjin JavaScript: Butiran PelaksanaanApr 17, 2025 am 12:05 AM

Memahami bagaimana enjin JavaScript berfungsi secara dalaman adalah penting kepada pemaju kerana ia membantu menulis kod yang lebih cekap dan memahami kesesakan prestasi dan strategi pengoptimuman. 1) aliran kerja enjin termasuk tiga peringkat: parsing, penyusun dan pelaksanaan; 2) Semasa proses pelaksanaan, enjin akan melakukan pengoptimuman dinamik, seperti cache dalam talian dan kelas tersembunyi; 3) Amalan terbaik termasuk mengelakkan pembolehubah global, mengoptimumkan gelung, menggunakan const dan membiarkan, dan mengelakkan penggunaan penutupan yang berlebihan.

Python vs JavaScript: Keluk Pembelajaran dan Kemudahan PenggunaanPython vs JavaScript: Keluk Pembelajaran dan Kemudahan PenggunaanApr 16, 2025 am 12:12 AM

Python lebih sesuai untuk pemula, dengan lengkung pembelajaran yang lancar dan sintaks ringkas; JavaScript sesuai untuk pembangunan front-end, dengan lengkung pembelajaran yang curam dan sintaks yang fleksibel. 1. Sintaks Python adalah intuitif dan sesuai untuk sains data dan pembangunan back-end. 2. JavaScript adalah fleksibel dan digunakan secara meluas dalam pengaturcaraan depan dan pelayan.

Python vs JavaScript: Komuniti, Perpustakaan, dan SumberPython vs JavaScript: Komuniti, Perpustakaan, dan SumberApr 15, 2025 am 12:16 AM

Python dan JavaScript mempunyai kelebihan dan kekurangan mereka sendiri dari segi komuniti, perpustakaan dan sumber. 1) Komuniti Python mesra dan sesuai untuk pemula, tetapi sumber pembangunan depan tidak kaya dengan JavaScript. 2) Python berkuasa dalam bidang sains data dan perpustakaan pembelajaran mesin, sementara JavaScript lebih baik dalam perpustakaan pembangunan dan kerangka pembangunan depan. 3) Kedua -duanya mempunyai sumber pembelajaran yang kaya, tetapi Python sesuai untuk memulakan dengan dokumen rasmi, sementara JavaScript lebih baik dengan MDNWebDocs. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Dari C/C ke JavaScript: Bagaimana semuanya berfungsiDari C/C ke JavaScript: Bagaimana semuanya berfungsiApr 14, 2025 am 12:05 AM

Peralihan dari C/C ke JavaScript memerlukan menyesuaikan diri dengan menaip dinamik, pengumpulan sampah dan pengaturcaraan asynchronous. 1) C/C adalah bahasa yang ditaip secara statik yang memerlukan pengurusan memori manual, manakala JavaScript ditaip secara dinamik dan pengumpulan sampah diproses secara automatik. 2) C/C perlu dikumpulkan ke dalam kod mesin, manakala JavaScript adalah bahasa yang ditafsirkan. 3) JavaScript memperkenalkan konsep seperti penutupan, rantaian prototaip dan janji, yang meningkatkan keupayaan pengaturcaraan fleksibiliti dan asynchronous.

Enjin JavaScript: Membandingkan PelaksanaanEnjin JavaScript: Membandingkan PelaksanaanApr 13, 2025 am 12:05 AM

Enjin JavaScript yang berbeza mempunyai kesan yang berbeza apabila menguraikan dan melaksanakan kod JavaScript, kerana prinsip pelaksanaan dan strategi pengoptimuman setiap enjin berbeza. 1. Analisis leksikal: Menukar kod sumber ke dalam unit leksikal. 2. Analisis Tatabahasa: Menjana pokok sintaks abstrak. 3. Pengoptimuman dan Penyusunan: Menjana kod mesin melalui pengkompil JIT. 4. Jalankan: Jalankan kod mesin. Enjin V8 mengoptimumkan melalui kompilasi segera dan kelas tersembunyi, Spidermonkey menggunakan sistem kesimpulan jenis, menghasilkan prestasi prestasi yang berbeza pada kod yang sama.

Beyond the Browser: JavaScript di dunia nyataBeyond the Browser: JavaScript di dunia nyataApr 12, 2025 am 12:06 AM

Aplikasi JavaScript di dunia nyata termasuk pengaturcaraan sisi pelayan, pembangunan aplikasi mudah alih dan Internet of Things Control: 1. Pengaturcaraan sisi pelayan direalisasikan melalui node.js, sesuai untuk pemprosesan permintaan serentak yang tinggi. 2. Pembangunan aplikasi mudah alih dijalankan melalui reaktnatif dan menyokong penggunaan silang platform. 3. Digunakan untuk kawalan peranti IoT melalui Perpustakaan Johnny-Five, sesuai untuk interaksi perkakasan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)