โมดูลบัฟเฟอร์
JS ได้รับการออกแบบมาสำหรับเบราว์เซอร์เดิมดังนั้นจึงสามารถจัดการสตริงที่เข้ารหัสด้วย Unicode ได้ดี แต่ไม่สามารถจัดการข้อมูลไบนารีได้ดี นี่เป็นปัญหาของ node.js เนื่องจาก node.js ถูกออกแบบมาเพื่อส่งและรับข้อมูลที่มักจะส่งในรูปแบบไบนารีบนเครือข่าย ตัวอย่างเช่น:
- ส่งและรับข้อมูลผ่านการเชื่อมต่อ TCP;
- อ่านข้อมูลไบนารีจากรูปภาพหรือไฟล์บีบอัด;
- อ่านและเขียนข้อมูลจากระบบไฟล์
- ประมวลผลสตรีมข้อมูลไบนารีจากเครือข่าย
โมดูลบัฟเฟอร์นำวิธีการไปยัง node.js เพื่อจัดเก็บข้อมูลดิบดังนั้นข้อมูลไบนารีสามารถใช้ในบริบทของ JS เมื่อใดก็ตามที่ข้อมูลย้ายในการดำเนินการ I/O จะต้องดำเนินการใน node.js คุณสามารถใช้โมดูลบัฟเฟอร์
คลาส: บัฟเฟอร์
คลาสบัฟเฟอร์เป็นประเภทตัวแปรส่วนกลางที่ใช้ในการประมวลผลข้อมูลไบนารีโดยตรง มันสามารถสร้างได้หลายวิธี
ข้อมูลดิบจะถูกบันทึกไว้ในอินสแตนซ์ของคลาสบัฟเฟอร์ อินสแตนซ์บัฟเฟอร์คล้ายกับอาร์เรย์ของจำนวนเต็ม
1. ใหม่บัฟเฟอร์ (ขนาด): จัดสรรบัฟเฟอร์ขนาดบัฟเฟอร์ใหม่ 8 บิตไบต์ที่มีขนาด
2. บัฟเฟอร์ใหม่ (อาร์เรย์): กำหนดบัฟเฟอร์ใหม่เพื่อใช้อาร์เรย์ไบต์ 8 บิต
3. บัฟเฟอร์ใหม่ (STR, [การเข้ารหัส]): การเข้ารหัสประเภทสตริง-วิธีการเข้ารหัสสิ่งที่ใช้และพารามิเตอร์เป็นตัวเลือก
4. เมธอดคลาส: buffer.isencoding (การเข้ารหัส): ส่งคืนจริงถ้าการเข้ารหัสการเข้ารหัสที่กำหนดนั้นถูกต้องมิฉะนั้นจะส่งคืนเท็จ
5. วิธีการเรียน: Buffer.isbuffer (OBJ): ทดสอบว่า OBJ นี้เป็นบัฟเฟอร์หรือไม่ ส่งคืนบูลีน
6. เมธอดคลาส: buffer.concat (รายการ, [totallength]): รายการ {array} ประเภทอาร์เรย์, อาร์เรย์บัฟเฟอร์, ใช้เพื่อเชื่อมต่อ Totallength {number} ประเภทขนาดรวมของบัฟเฟอร์ทั้งหมดของอาร์เรย์บัฟเฟอร์ด้านบน
นอกเหนือจากการอ่านไฟล์เพื่อรับอินสแตนซ์บัฟเฟอร์แล้วยังสามารถสร้างได้โดยตรงเช่น:
การคัดลอกรหัสมีดังนี้:
var bin = บัฟเฟอร์ใหม่ ([0x48, 0x65, 0x6c, 0x6c, 0x6c]);
บัฟเฟอร์คล้ายกับสตริง นอกเหนือจากการใช้แอตทริบิวต์. ความยาวเพื่อให้ได้ความยาวไบต์คุณยังสามารถใช้วิธี [ดัชนี] เพื่ออ่านไบต์ที่ตำแหน่งที่ระบุเช่น:
การคัดลอกรหัสมีดังนี้:
ถังขยะ [0]; // => 0x48;
บัฟเฟอร์และสตริงสามารถแปลงเป็นกันได้เช่นข้อมูลไบนารีสามารถแปลงเป็นสตริงได้โดยใช้การเข้ารหัสที่ระบุ:
การคัดลอกรหัสมีดังนี้:
var str = bin.toString ('UTF-8'); // => "สวัสดี"
แทนที่จะส่งคืนบัฟเฟอร์ใหม่วิธี. slice ส่งคืนตัวชี้ไปยังตำแหน่งที่อยู่ตรงกลางของบัฟเฟอร์ดั้งเดิมดังที่แสดงด้านล่าง
การคัดลอกรหัสมีดังนี้:
1. [0x48, 0x65, 0x6c, 0x6c, 0x6c]
2. ^ ^
3. | -
4. bin bin.slice (2)
เขียนถึงบัฟเฟอร์
การคัดลอกรหัสมีดังนี้:
var buffer = buffer ใหม่ (8); // สร้างบัฟเฟอร์ที่มีการจัดสรรหน่วยความจำ 8 ไบต์
console.log (buffer.write ('a', 'utf8')); // output 1
สิ่งนี้จะเขียนอักขระ "A" ไปยังบัฟเฟอร์และโหนดจะส่งคืนจำนวนไบต์ที่เขียนไปยังบัฟเฟอร์หลังจากถูกเข้ารหัส การเข้ารหัส UTF-8 ของตัวอักษร A ที่นี่ใช้เวลา 1 ไบต์
คัดลอกบัฟเฟอร์
node.js จัดเตรียมวิธีการคัดลอกเนื้อหาทั้งหมดของวัตถุบัฟเฟอร์ลงในวัตถุบัฟเฟอร์อื่น เราสามารถคัดลอกระหว่างวัตถุบัฟเฟอร์ที่มีอยู่เท่านั้นดังนั้นเราต้องสร้างมันขึ้นมา
การคัดลอกรหัสมีดังนี้:
buffer.copy (buffertocopyto)
ในหมู่พวกเขา Buffertocopyto เป็นวัตถุบัฟเฟอร์เป้าหมายที่จะคัดลอก ตัวอย่างต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
var buffer1 = บัฟเฟอร์ใหม่ (8);
buffer1.write ('ยินดีที่ได้รู้จักคุณ', 'utf8');
var buffer2 = บัฟเฟอร์ใหม่ (8);
buffer1.copy (buffer2);
console.log (buffer2.toString ()); // ยินดีที่ได้พบคุณ
โมดูลสตรีม
ในระบบปฏิบัติการประเภท UNIX สตรีมมิ่งเป็นแนวคิดมาตรฐาน มีสามสตรีมหลักดังนี้:
1. อินพุตมาตรฐาน
2. เอาต์พุตมาตรฐาน
3. ข้อผิดพลาดมาตรฐาน
สตรีมที่อ่านได้
หากบัฟเฟอร์เป็นวิธีที่ node.js จัดการข้อมูลดิบจากนั้นสตรีมมักจะเป็นวิธีที่ node.js ย้ายข้อมูล สตรีมใน node.js สามารถอ่านได้หรือเขียนได้ โมดูลจำนวนมากใน node.js ใช้สตรีมรวมถึง HTTP และระบบไฟล์
สมมติว่าเราสร้างไฟล์ Classmates.txt และอ่านรายการชื่อจากมันเพื่อให้เราสามารถใช้ข้อมูลนี้ได้ เนื่องจากข้อมูลเป็นสตรีมซึ่งหมายความว่าก่อนที่จะทำการอ่านไฟล์คุณสามารถดำเนินการกับข้อมูลจากสองสามไบต์แรกที่ได้รับ นี่เป็นรูปแบบทั่วไปใน node.js:
การคัดลอกรหัสมีดังนี้:
var fs = ต้องการ ('fs');
var stream = fs.readStream ('clersmates.txt');
Stream.setEncoding ('UTF8');
stream.on ('data', ฟังก์ชัน (chunk) {
console.log ('อ่านข้อมูลบางส่วน')
-
stream.on ('ปิด', function () {
console.log ('ข้อมูลทั้งหมดถูกอ่าน')
-
ในตัวอย่างข้างต้นข้อมูลเหตุการณ์จะถูกทริกเกอร์เมื่อได้รับข้อมูลใหม่ เหตุการณ์ปิดจะถูกทริกเกอร์เมื่อไฟล์อ่านเสร็จสมบูรณ์
กระแสที่เขียนได้
เห็นได้ชัดว่าเรายังสามารถสร้างสตรีมที่เขียนได้เพื่อเขียนข้อมูล ซึ่งหมายความว่าสามารถใช้สคริปต์ง่ายๆเพื่ออ่านในไฟล์แล้วเขียนไปยังไฟล์อื่น:
การคัดลอกรหัสมีดังนี้:
var fs = ต้องการ ('fs');
var readableStream = fs.readStream ('clersmates.txt');
var writableStream = fs.writestream ('names.txt');
ReadableStream.setEncoding ('UTF8');
readableStream.on ('ข้อมูล', ฟังก์ชั่น (ก้อน) {
writableStream.write (ก้อน);
-
readableStream.on ('ปิด', function () {
writableStream.end ();
-
ตอนนี้เมื่อได้รับเหตุการณ์ข้อมูลข้อมูลจะถูกเขียนไปยังสตรีมที่เขียนได้
Readable.setEncoding (การเข้ารหัส): return: this
Readable.resume (): เหมือนกับด้านบน วิธีนี้ช่วยให้สตรีมที่อ่านได้สามารถเรียกเหตุการณ์ข้อมูลต่อไปได้
Readable.pause (): เหมือนกับด้านบน วิธีนี้ทำให้สตรีมในโหมดการไหลหยุดทริกเกอร์เหตุการณ์ข้อมูลเปลี่ยนไปใช้โหมดที่ไม่ไหลและปล่อยให้ข้อมูลที่มีอยู่ในบัฟเฟอร์ภายใน
คลาส: Stream.wratable
อินเทอร์เฟซสตรีมที่เขียนได้เป็นนามธรรมของข้อมูลที่คุณเขียนถึงเป้าหมาย
1.wwable.write (chunk, [การเข้ารหัส], [callback]):
Chunk {String | บัฟเฟอร์} ข้อมูลที่จะเขียน
การเข้ารหัส {string} การเข้ารหัสถ้าก้อนเป็นสตริง
การโทรกลับ {function} callback หลังจากการเขียนบล็อกข้อมูล
return: {boolean} จริงถ้าข้อมูลได้รับการประมวลผลทั้งหมด
วิธีนี้เขียนข้อมูลไปยังระบบพื้นฐานและเรียกการโทรกลับที่กำหนดหลังจากประมวลผลข้อมูล
2.wwitable.cork (): ถูกบังคับให้ดักทั้งหมดเขียน
ข้อมูลที่ติดอยู่จะถูกเขียนเมื่อมีการเรียกการโทร. uncork () หรือ. end ()
3.wwitable.end ([chunk], [การเข้ารหัส], [callback])
Chunk {String | บัฟเฟอร์} เป็นทางเลือกข้อมูลที่จะเขียน
การเข้ารหัส {string} การเข้ารหัสถ้าก้อนเป็นสตริง
การโทรกลับ {function} เป็นทางเลือกการโทรกลับหลังจากสตรีมจะสิ้นสุดลง
การโทรเขียน () หลังจากการโทรสิ้นสุด () จะสร้างข้อผิดพลาด
การคัดลอกรหัสมีดังนี้:
// เขียน 'สวัสดี' แล้วจบลงด้วย 'World!'
http.createserver (ฟังก์ชั่น (req, res) {
res.write ('สวัสดี');
Res.end ('World!');
// ตอนนี้ไม่ได้รับอนุญาตให้เขียนต่อไป
-