Rumah >hujung hadapan web >tutorial js >Penjelasan terperinci tentang modul Penampan dalam NodeJS_node.js
1, analisis pembukaan
Penampan penimbal yang dipanggil bermaksud "kawasan storan sementara", iaitu bahagian memori yang menyimpan data input dan output buat sementara waktu.
Bahasa JS itu sendiri hanya mempunyai jenis data rentetan dan tiada jenis data binari, jadi NodeJS menyediakan Penimbal pembina global bersamaan dengan String untuk menyediakan operasi pada data binari. Selain membaca fail untuk mendapatkan contoh Penampan, ia juga boleh dibina secara langsung, contohnya:
Terdapat perbezaan penting antara Penampan dan rentetan. Rentetan adalah baca sahaja, dan sebarang pengubahsuaian pada rentetan menghasilkan rentetan baharu, manakala rentetan asal kekal tidak berubah.
Bagi Penampan, ia lebih seperti tatasusunan bahasa C yang boleh melakukan operasi penunjuk. Sebagai contoh, anda boleh menggunakan kaedah [indeks] untuk mengubah suai bait secara langsung pada kedudukan tertentu.
------------------------------------------------ --------------------------------------------------- --------------------------------------------------- --------------------------------------------------- --- --------------------------------
Kaedah
slice tidak mengembalikan Penampan baharu, sebaliknya mengembalikan penuding ke kedudukan di tengah Penampan asal, seperti ditunjukkan di bawah.[ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]
|
bin bin.slice(2)
Oleh itu, pengubahsuaian kepada Penampan yang dikembalikan melalui kaedah hirisan akan menjejaskan Penampan asal, contohnya:
Ini sama seperti memohon memori baharu dan menyalin data dalam memori sedia ada. Di bawah adalah contoh.
Ringkasnya, Penampan memanjangkan keupayaan pemprosesan data JS daripada rentetan kepada data binari arbitrari.
Di atas ialah pengenalan ringkas tentang apa itu Penampan Mari kita bincangkan tentang cara menggunakannya dan senario penggunaan khusus.
Dua, mari bercakap tentang Penampan
JavaScript sangat mesra pemprosesan rentetan sama ada bait lebar atau rentetan bait tunggal, ia dianggap sebagai rentetan. Node perlu memproses protokol rangkaian, mengendalikan pangkalan data, memproses gambar, muat naik fail, dsb. Ia juga perlu memproses sejumlah besar data binari Rentetan terbina dalam jauh daripada memenuhi keperluan ini, jadi Penimbal wujud.
Struktur penimbal
Penimbal ialah modul biasa yang menggabungkan Javascript dan C. Bahagian berkaitan prestasi dilaksanakan dalam C, dan bahagian bukan berkaitan prestasi dilaksanakan dalam JavaScript.
Node telah pun memuatkan Penampan ke dalam memori apabila proses bermula dan meletakkannya ke dalam objek global, jadi tidak perlu memerlukan
Objek penimbal: serupa dengan tatasusunan, elemennya ialah dua digit digit perenambelasan.
Peruntukan memori penimbal
Peruntukan memori objek Penampan tidak berada dalam memori timbunan V8 Aplikasi memori dilaksanakan pada tahap C Node.
Untuk menggunakan memori yang diminta dengan cekap, Node menggunakan mekanisme peruntukan papak ialah mekanisme pengurusan memori dinamik yang menggunakan pelbagai sistem pengendalian *nix. Papak mempunyai tiga keadaan:
(1) penuh: status diperuntukkan sepenuhnya
(2) separa: status peruntukan separa
(3) kosong: tiada status diberikan
Penukaran penimbal
Objek penimbal boleh ditukar kepada dan daripada rentetan Jenis pengekodan yang disokong adalah seperti berikut:
ASCII, UTF-8, UTF-16LE/UCS-2, Base64, Binary, Hex
Rentetan untuk Penampan
Penimbal baharu(str, [pengekodan]), lalai UTF-8
buf.write(rentetan, [offset], [panjang], [pengekodan])
Penimbal kepada rentetan
buf.toString([pengekodan], [mula], [tamat])
Jenis pengekodan tidak disokong oleh Penampan
Tentukan sama ada ia disokong oleh Buffer.isEncoding(encoding)
iconv-lite: Pelaksanaan JavaScript tulen, berat lebih ringan, prestasi lebih baik tanpa penukaran C kepada javascript
iconv: Panggil pustaka libiconv C untuk melengkapkan
Penyambungan penimbal
Beri perhatian kepada "res.on('data', function(chunk) {})". boleh dijana ,
Penyelesaian:
(1) Melalui kaedah setEncoding() dalam strim boleh dibaca, kaedah ini membenarkan peristiwa data dihantar bukan lagi sebagai objek Penampan, tetapi sebagai rentetan yang dikodkan, yang menggunakan modul StringEncoder secara dalaman.
(2) Simpan objek Penampan ke dalam tatasusunan buat sementara waktu, dan akhirnya pasangkannya ke dalam Penampan yang besar dan kemudian kodkannya ke dalam rentetan untuk output.
Penimbal digunakan secara meluas dalam fail I/O dan rangkaian I/O Prestasinya sangat penting, dan prestasinya jauh lebih tinggi daripada rentetan biasa.
Selain kehilangan prestasi dalam menukar rentetan, penggunaan Buffer mempunyai tetapan highWaterMark yang penting untuk prestasi semasa membaca fail.
a. Tetapan highWaterMark mempunyai kesan tertentu pada peruntukan dan penggunaan memori Penampan.
b. Menetapkan highWaterMark terlalu kecil boleh mengakibatkan terlalu banyak panggilan sistem.
Bila hendak menggunakan penimbal dan bila tidak menggunakannya ------ Javascript tulen menyokong kod unicode tetapi bukan binari Apabila berurusan dengan strim TCP atau strim fail, adalah perlu untuk memproses strim tersebut. utf-8, binari dan format lain, kita mesti menggunakan "Buffer".
3. Pengenalan contoh
Berikut ialah keputusannya:
Kelajuan membaca rentetan pasti lebih pantas, dan penimbal juga memerlukan operasi toString(). Oleh itu, apabila kita menyimpan rentetan, kita harus menggunakan rentetan atau rentetan Walaupun rentetan besar disambungkan ke dalam rentetan, kelajuan penyambungannya tidak akan lebih perlahan daripada penampan.
Jadi bila kita perlu menggunakan penimbal lagi? Apabila tidak ada cara lain, apabila kita menyimpan rentetan bukan utf-8, binari dan format lain, kita mesti menggunakannya.
Empat, ringkasan
(1), JavaScript sesuai untuk memproses data yang dikodkan Unicode, tetapi ia tidak mesra pemprosesan data binari.
(2), jadi apabila memproses aliran TCP atau sistem fail, adalah perlu untuk memproses aliran oktet.
(3), Node mempunyai beberapa kaedah untuk memproses, mencipta dan menggunakan aliran oktet.
(4) Data asal disimpan dalam contoh Penampan A adalah serupa dengan tatasusunan integer, tetapi memorinya diperuntukkan di luar tindanan V8. Saiz Penampan tidak boleh diubah.
(5), jenis pengekodan yang diproses ialah: ascii, utf8, utf16le, ucs2 (alias utf16le), base64, binari, hex.
(6), Penampan ialah elemen global, dan anda boleh mendapatkan contoh Penampan secara langsung dengan menggunakan Penampan baharu().