Modul buffer
JS awalnya dirancang untuk browser, sehingga dapat menangani string yang dikodekan unicode dengan baik, tetapi tidak dapat menangani data biner dengan baik. Ini adalah masalah dengan Node.js, karena Node.js dirancang untuk mengirim dan menerima data yang sering ditransmisikan dalam format biner di jaringan. Misalnya:
- mengirim dan menerima data melalui koneksi TCP;
- Baca data biner dari gambar atau file terkompresi;
- Membaca dan menulis data dari sistem file;
- Proses aliran data biner dari jaringan
Modul buffer membawa metode ke node.js untuk menyimpan data mentah, sehingga data biner dapat digunakan dalam konteks JS. Setiap kali data dipindahkan dalam operasi I/O perlu diproses di Node.js, dimungkinkan untuk menggunakan modul buffer.
Kelas: Buffer
Kelas buffer adalah jenis variabel global yang digunakan untuk secara langsung memproses data biner. Ini dapat dibangun dengan berbagai cara.
Data mentah disimpan dalam contoh kelas buffer. Contoh buffer mirip dengan array bilangan bulat
1. Buffer baru (ukuran): Alokasikan byte 8-bit buffer baru yang ukurannya ukurannya.
2. Buffer baru (array): Tetapkan buffer baru untuk menggunakan array byte 8-bit.
3. Buffer baru (STR, [Pengkodean]): Pengkodean string tipe-apa yang digunakan oleh metode pengkodean, dan parameternya opsional.
4. Metode kelas: buffer.isencoding (pengkodean): Kembalikan true jika penyandian penyandian yang diberikan valid, jika tidak, kembalikan false.
5. Metode Kelas: Buffer.isbuffer (OBJ): Uji apakah OBJ ini adalah buffer. Mengembalikan boolean
6. Metode kelas: buffer.concat (daftar, [totallength]): daftar {array} tipe array, array buffer, digunakan untuk dihubungkan. totallength {number} ketik ukuran total semua buffer dari array buffer di atas.
Selain membaca file untuk mendapatkan instance buffer, itu juga dapat dibangun secara langsung, misalnya:
Salinan kode adalah sebagai berikut:
var bin = buffer baru ([0x48, 0x65, 0x6c, 0x6c, 0x6c]);
Buffer mirip dengan string. Selain menggunakan atribut .length untuk mendapatkan panjang byte, Anda juga dapat menggunakan metode [indeks] untuk membaca byte pada posisi yang ditentukan, misalnya:
Salinan kode adalah sebagai berikut:
bin [0]; // => 0x48;
Buffer dan string dapat dikonversi satu sama lain, misalnya, data biner dapat dikonversi ke string menggunakan pengkodean yang ditentukan:
Salinan kode adalah sebagai berikut:
var str = bin.tostring ('UTF-8'); // => "halo"
Alih -alih mengembalikan buffer baru, metode .slice mengembalikan pointer ke lokasi di tengah buffer asli, seperti yang ditunjukkan di bawah ini.
Salinan kode adalah sebagai berikut:
1. [0x48, 0x65, 0x6c, 0x6c, 0x6c]
2. ^ ^
3. | |
4. Bin bin.slice (2)
Tulis ke buffer
Salinan kode adalah sebagai berikut:
var buffer = buffer baru (8); // Buat buffer dengan 8 byte memori yang dialokasikan
console.log (buffer.write ('a', 'utf8')); // output 1
Ini akan menulis karakter "A" ke buffer, dan simpul mengembalikan jumlah byte yang ditulis ke buffer setelah dikodekan. Pengkodean UTF-8 dari huruf A di sini memakan 1 byte.
Salin buffer
Node.js menyediakan metode untuk menyalin seluruh konten objek buffer ke objek buffer lain. Kami hanya dapat menyalin di antara objek buffer yang ada, jadi kami harus membuatnya.
Salinan kode adalah sebagai berikut:
buffer.copy (bufertocopyto)
Di antara mereka, Buffertocopyto adalah objek buffer target yang harus disalin. Contoh berikut:
Salinan kode adalah sebagai berikut:
var buffer1 = buffer baru (8);
buffer1.write ('Senang bertemu u', 'utf8');
var buffer2 = buffer baru (8);
buffer1.copy (buffer2);
Console.log (buffer2.tostring ()); // Senang bertemu Anda
Modul stream
Dalam sistem operasi tipe UNIX, streaming adalah konsep standar. Ada tiga aliran utama sebagai berikut:
1. Input standar
2. Output standar
3. Kesalahan standar
Aliran yang dapat dibaca
Jika buffer adalah cara Node.js menangani data mentah, maka aliran biasanya cara Node.js memindahkan data. Stream di Node.js dapat dibaca atau dapat ditulis. Banyak modul di Node.js menggunakan aliran, termasuk HTTP dan sistem file.
Misalkan kami membuat file classmates.txt dan membaca daftar nama darinya sehingga kami dapat menggunakan data ini. Karena data adalah aliran, ini berarti bahwa sebelum menyelesaikan pembacaan file, Anda dapat bertindak berdasarkan data dari beberapa byte pertama yang diterima. Ini adalah pola umum di Node.js:
Salinan kode adalah sebagai berikut:
var fs = membutuhkan ('fs');
var stream = fs.readStream ('classmates.txt');
stream.setencoding ('UTF8');
stream.on ('data', function (chunk) {
console.log ('baca beberapa data')
});
stream.on ('tutup', function () {
Console.log ('Semua data dibaca')
});
Dalam contoh di atas, data acara dipicu ketika data baru diterima. Acara penutupan dipicu saat file dibaca selesai.
Aliran yang dapat ditulis
Jelas, kami juga dapat membuat aliran yang dapat ditulis untuk menulis data. Ini berarti bahwa hanya skrip sederhana dapat digunakan untuk membaca ke dalam file dan kemudian menulis ke file lain:
Salinan kode adalah sebagai berikut:
var fs = membutuhkan ('fs');
var readableStream = fs.readStream ('classmates.txt');
var writableStream = fs.writeStream ('name.txt');
readableStream.setencoding ('UTF8');
readableStream.on ('data', function (chunk) {
writableStream.write (chunk);
});
readableStream.on ('tutup', function () {
writableStream.end ();
});
Sekarang, ketika acara data diterima, data ditulis ke aliran yang dapat ditulis.
readable.setencoding (encoding): return: this
readable.resume (): Sama seperti di atas. Metode ini memungkinkan aliran yang dapat dibaca untuk terus memicu acara data.
readable.pause (): Sama seperti di atas. Metode ini menyebabkan aliran aliran dalam aliran untuk berhenti memicu peristiwa data, beralih ke mode non-aliran, dan meninggalkan data yang tersedia berikutnya dalam buffer internal.
Kelas: Stream.wranting
Antarmuka aliran writable adalah abstraksi dari data yang Anda tulis ke target.
1.writable.write (chunk, [encoding], [callback]):
chunk {string | Buffer} data yang akan ditulis
Pengkodean {string} encoding, jika chunk adalah string
callback {function} callback setelah penulisan blok data
Return: {boolean} true jika data telah diproses semua.
Metode ini menulis data ke sistem yang mendasarinya dan memanggil panggilan balik yang diberikan setelah data diproses.
2.writable.cork (): dipaksa untuk menjebak semua penulisan.
Data yang macet akan ditulis ketika panggilan .uncork () atau .end () dipanggil.
3.writable.end ([chunk], [encoding], [callback])
chunk {string | Buffer} opsional, data yang akan ditulis
Pengkodean {string} encoding, jika chunk adalah string
callback {function} opsional, callback setelah aliran berakhir
Memanggil write () Setelah menelepon akhir () akan menghasilkan kesalahan.
Salinan kode adalah sebagai berikut:
// Tulis 'Halo,' dan kemudian akhiri dengan 'Dunia!'
http.createServer (function (req, res) {
res.write ('halo,');
res.end ('World!');
// sekarang tidak diizinkan untuk terus menulis
});