وحدة المخزن المؤقت
تم تصميم JS في الأصل للمتصفحات ، بحيث يمكنه التعامل مع سلاسل مشفرة بشكل جيد ، لكنها لا تستطيع التعامل مع البيانات الثنائية بشكل جيد. هذه مشكلة في Node.js ، لأن Node.js مصمم لإرسال واستلام البيانات التي يتم نقلها غالبًا بتنسيق ثنائي على الشبكة. على سبيل المثال:
- إرسال واستقبال البيانات من خلال اتصال TCP ؛
- قراءة البيانات الثنائية من الصور أو الملفات المضغوطة ؛
- قراءة وكتابة البيانات من نظام الملفات ؛
- معالجة تدفقات البيانات الثنائية من الشبكة
توفر الوحدة العازلة طريقة إلى Node.js لتخزين البيانات الخام ، بحيث يمكن استخدام البيانات الثنائية في سياق JS. كلما كانت البيانات التي يتم نقلها في عمليات الإدخال/الإخراج تحتاج إلى معالجة في node.js ، فمن الممكن استخدام الوحدة العازلة.
الفصل: المخزن المؤقت
فئة العازلة هي نوع متغير عالمي يستخدم لمعالجة البيانات الثنائية مباشرة. يمكن بناؤها في مجموعة متنوعة من الطرق.
يتم حفظ البيانات الخام في مثيل من فئة المخزن المؤقت. يشبه مثيل المخزن المؤقت مجموعة من الأعداد الصحيحة
1. العازلة الجديدة (الحجم): تخصيص بايت جديد بحجم 8 بت من حجمه.
2.New Buffer (Array): قم بتعيين مخزن مؤقت جديد لاستخدام صفيف بايت 8 بت.
3.New Buffer (STR ، [الترميز]): يتم استخدام طريقة تشفير نوع الترميز ، والمعلمات اختيارية.
4. طريقة الفصل: buffer.isencoding (الترميز): إرجاع صحيح إذا كان الترميز المعطى صالحًا ، وإلا فإن إرجاع خطأ.
5. طريقة الفصل: buffer.isbuffer (OBJ): اختبار ما إذا كان هذا OBJ مخزن مؤقت. يعود منطقية
6. طريقة الفصل: buffer.concat (قائمة ، [TotAllength]): قائمة {Array} نوع المصفوفة ، صفيف المخزن المؤقت ، يستخدم ليكون متصلاً. TOTALLENGTH {number} اكتب الحجم الإجمالي لجميع المخازن المؤقتة من صفيف المخزن المؤقت أعلاه.
بالإضافة إلى قراءة الملفات للحصول على مثيلات عازلة ، يمكن أيضًا بناؤها مباشرة ، على سبيل المثال:
نسخة الكود كما يلي:
var bin = New Buffer ([0x48 ، 0x65 ، 0x6c ، 0x6c ، 0x6c]) ؛
المخزن المؤقت يشبه سلسلة. بالإضافة إلى استخدام سمة .Length للحصول على طول البايت ، يمكنك أيضًا استخدام طريقة [الفهرس] لقراءة البايتات في الموضع المحدد ، على سبيل المثال:
نسخة الكود كما يلي:
بن [0] ؛ // => 0x48 ؛
يمكن تحويل المخزن المؤقت والسلسلة إلى بعضهما البعض ، على سبيل المثال ، يمكن تحويل البيانات الثنائية إلى سلاسل باستخدام ترميز محدد:
نسخة الكود كما يلي:
var str = bin.toString ('utf-8') ؛ // => "مرحبا"
بدلاً من إرجاع المخزن المؤقت الجديد ، تقوم طريقة .slice بإرجاع مؤشر إلى موقع في منتصف المخزن المؤقت الأصلي ، كما هو موضح أدناه.
نسخة الكود كما يلي:
1. [0x48 ، 0x65 ، 0x6c ، 0x6c ، 0x6c]
2. ^ ^
3 |
4. بن بن.
اكتب إلى المخزن المؤقت
نسخة الكود كما يلي:
var buffer = new Buffer (8) ؛ // قم بإنشاء مخزن مؤقت مع 8 بايت من الذاكرة المخصصة
console.log (buffer.write ('a' ، 'utf8')) ؛ // output 1
سيؤدي ذلك إلى كتابة الحرف "A" إلى المخزن المؤقت ، وتُرجع العقدة عدد البايتات المكتوبة إلى المخزن المؤقت بعد تشفيرها. تشفير UTF-8 للحرف A هنا يأخذ بايت واحد.
نسخ المخزن المؤقت
يوفر Node.js طريقة لنسخ محتويات الكائن المخزن المؤقت بالكامل في كائن عازلة آخر. يمكننا فقط النسخ بين الكائنات العازلة الموجودة ، لذلك يتعين علينا إنشائها.
نسخة الكود كما يلي:
buffer.copy (Buffertocopyto)
من بينها ، Buffertocopyto هو كائن العازلة المستهدف المراد نسخه. المثال التالي:
نسخة الكود كما يلي:
var buffer1 = New Buffer (8) ؛
buffer1.write ('nice to in u' ، 'utf8') ؛
var buffer2 = New Buffer (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 = require ('fs') ؛
var dream = fs.readstream ('classmates.txt') ؛
Stream.SetEncoding ('Utf8') ؛
Dream.on ('Data' ، function (chunk) {
console.log ("اقرأ بعض البيانات")
}) ؛
Stream.on ('Close' ، function () {
console.log ("يتم قراءة جميع البيانات")
}) ؛
في المثال أعلاه ، يتم تشغيل بيانات الحدث عند استلام بيانات جديدة. يتم تشغيل الحدث الختامي عند اكتمال قراءة الملف.
دفق قابل للكتابة
من الواضح أنه يمكننا أيضًا إنشاء دفق قابل للكتابة لكتابة البيانات. هذا يعني أنه يمكن استخدام برنامج نصي بسيط فقط لقراءة الملف ثم الكتابة إلى ملف آخر:
نسخة الكود كما يلي:
var fs = require ('fs') ؛
var readablestream = fs.readstream ('classmates.txt') ؛
var writablestream = fs.writeStream ('names.txt') ؛
readablestream.setencoding ('Utf8') ؛
readablestream.on ('Data' ، function (chunk) {
writablestream.write (قطعة) ؛
}) ؛
readablestream.on ('Close' ، function () {
writablestream.end () ؛
}) ؛
الآن ، عند استلام حدث بيانات ، تتم كتابة البيانات إلى الدفق القابل للكتابة.
قابلة للقراءة
قابلة للقراءة. resume (): كما هو مذكور أعلاه. تتيح هذه الطريقة للدفق القابل للقراءة الاستمرار في تشغيل حدث البيانات.
قابلة للقراءة. تتسبب هذه الطريقة في توقف دفق في وضع التدفق عن تشغيل حدث البيانات ، والتبديل إلى وضع غير التدفق ، وترك البيانات المتاحة اللاحقة في المخزن المؤقت الداخلي.
الفصل: Stream.writable
واجهة الدفق القابلة للكتابة هي تجريد للبيانات التي تكتبها إلى هدف.
1.Writable.write (chunk ، [الترميز] ، [رد الاتصال]):
قطعة {سلسلة | المخزن المؤقت} البيانات المراد كتابة
ترميز {string} الترميز ، إذا كان الجزء عبارة عن سلسلة
رد الاتصال {function} رد الاتصال بعد كتابة كتلة البيانات
إرجاع: {boolean} صحيح إذا تمت معالجة البيانات جميعًا.
تكتب هذه الطريقة البيانات إلى النظام الأساسي وتدعو رد الاتصال المحدد بعد معالجة البيانات.
2.Writable.cork (): أجبر على فخ جميع الكتابة.
سيتم كتابة البيانات المعلقة عند استدعاء استدعاء. uncork () أو .end ().
3.litable.end ([chunk] ، [الترميز] ، [رد الاتصال])
قطعة {سلسلة | المخزن المؤقت} اختياريًا ، يجب كتابة البيانات
ترميز {string} الترميز ، إذا كان الجزء عبارة عن سلسلة
رد الاتصال {function} اختياري ، رد الاتصال بعد انتهاء الدفق
استدعاء الكتابة () بعد استدعاء end () سوف يولد خطأ.
نسخة الكود كما يلي:
// اكتب "مرحبًا" ثم انتهى بـ "العالم!"
http.createserver (وظيفة (req ، الدقة) {
Res.Write ('hello ،') ؛
Res.end ('World!') ؛
// الآن غير مسموح بمواصلة الكتابة
}) ؛