stream - C#باستخدام تدفقات




(8)

تيارات هي نوع من الغموض بالنسبة لي. لا أعرف متى أستخدم الدفق وكيفية استخدامه. هل يمكن لأي شخص أن يشرح لي كيف يتم استخدام التدفقات؟

إذا فهمت بشكل صحيح ، فهناك ثلاثة أنواع من الدفق:

  • stream
  • read stream
  • write stream

هل هذا صحيح؟ وعلى سبيل المثال ، ما هو الفرق بين Memorystream و FileStream ؟


Answers

الدفق هو كائن يستخدم لنقل البيانات. هناك فئة دفق عامة System.IO.Stream ، والتي من خلالها يتم اشتقاق كل فئات الدفق الأخرى في .NET. فئة Stream يتعامل مع بايت.

يتم استخدام فئات دفق الخرسانة للتعامل مع أنواع البيانات الأخرى من وحدات البايت. فمثلا:

  • يتم FileStream فئة FileStream عندما يكون المصدر الخارجي ملفًا
  • يستخدم MemoryStream لتخزين البيانات في الذاكرة
  • يعالج System.Net.Sockets.NetworkStream بيانات الشبكة

تيارات القارئ / الكاتب مثل StreamReader و StreamWriter ليست تدفقات - لا يتم اشتقاقها من System.IO.Stream ، فهي مصممة للمساعدة في كتابة وقراءة البيانات من وإلى البث!


لا يمكنني أن أدعو تلك الأنواع المختلفة من الجداول. تحتوي فئة دفق على خصائص CanRead و CanWrite التي تخبرك ما إذا كان يمكن قراءة الدفق الخاص من وكتب إلى.

يعتبر الاختلاف الرئيسي بين فئات البث المختلفة (مثل MemoryStream مقابل FileStream) هو مخزن الدعم - حيث تتم قراءة البيانات من أو أين يتم كتابتها. إنه شيء واضح من الاسم. يقوم MemoryStream بتخزين البيانات في الذاكرة فقط ، يتم دعم FileStream بملف على القرص ، ويقوم NetworkStream بقراءة البيانات من الشبكة وما إلى ذلك.


للتوسع قليلاً في الإجابات الأخرى هنا ، وساعد في شرح الكثير من مثال الكود الذي ستشاهده ، معظم الوقت الذي لا تقرأه وتكتبه إلى البث مباشرةً. تيارات هي وسيلة منخفضة المستوى لنقل البيانات.

ستلاحظ أن وظائف القراءة والكتابة كلها موجهة نحو البايت ، على سبيل المثال WriteByte (). لا توجد وظائف للتعامل مع الأعداد الصحيحة ، الخ السلاسل إلخ. هذا يجعل الدفق ذا غاية عامة ، ولكنه أقل تعقيدًا للعمل إذا كنت تريد نقل النص فقط.

ومع ذلك ، توفر .NET فئات تقوم بالتحويل بين الأنواع الأصلية وواجهة البث ذات المستوى المنخفض ، وتقوم بنقل البيانات إلى أو من الدفق من أجلك. بعض هذه الطبقات البارزة هي:

StreamWriter // Badly named. Should be TextWriter.
StreamReader // Badly named. Should be TextReader.
BinaryWriter
BinaryReader

لاستخدام هذه الميزات ، ستحصل أولاً على مجموعتك ، ثم تنشئ إحدى الفئات المذكورة أعلاه وتربطها بالتيار. على سبيل المثال

MemoryStream memoryStream = new MemoryStream();
StreamWriter myStreamWriter = new StreamWriter(memoryStream);

تحويل StreamReader و StreamWriter بين الأنواع الأصلية وتمثيل سلسلة الخاصة بهم ثم نقل السلاسل إلى من الدفق والبايت. وبالتالي

myStreamWriter.Write(123);

سوف يكتب "123" (ثلاثة أحرف '1' ، '2' ثم '3') إلى الدفق. إذا كنت تتعامل مع ملفات نصية (مثل html) ، فإن StreamReader و StreamWriter هما الفئة التي ستستخدمها.

بينما

myBinaryWriter.Write(123);

سوف يكتب أربعة بايت يمثل قيمة عدد صحيح 32 بت 123 (0x7B ، 0x00 ، 0x00 ، 0x00). إذا كنت تتعامل مع الملفات الثنائية أو بروتوكولات الشبكة ، فإن BinaryReader و BinaryWriter هما ما يمكنك استخدامه. (إذا كنت تقوم بتبادل البيانات مع شبكات أو أنظمة أخرى ، يجب أن تضع في اعتبارها الأمور endianness ، ولكن هذه وظيفة أخرى).


دفق هو مجرد تجريد (أو المجمع) على تدفق physical للبايت. يسمى هذا التدفق physical التدفق base stream . لذلك هناك دائما دفق قاعدة التي يتم إنشاء المجمع تيار وبالتالي يتم تسمية المجمع بعد نوع دفق قاعدة أي FileStream ، MemoryStream الخ

تكمن ميزة غلاف المجمع في حصولك على واجهة برمجة تطبيقات موحدة للتفاعل مع تيارات أي نوع usb, file أساسي usb, file وما إلى ذلك.

لماذا تعامل البيانات كتيار - نظرًا لأنه يتم تحميل قطع البيانات عند الطلب ، يمكننا فحص / معالجة البيانات كمقطع بدلاً من تحميل البيانات بالكامل في الذاكرة. هذه هي الطريقة التي تتعامل بها معظم البرامج مع الملفات الكبيرة ، على سبيل المثال تشفير ملف صورة نظام التشغيل.


تيارات جيدة للتعامل مع كميات كبيرة من البيانات. عندما يكون من غير العملي تحميل جميع البيانات إلى الذاكرة في نفس الوقت ، يمكنك فتحها كتيار والعمل مع قطع صغيرة منها.


هناك نوع أساسي واحد فقط من Stream . ولكن في حالات مختلفة ، يقوم بعض الأعضاء بطرح استثناء عند استدعائه لأنه في هذا السياق لم تكن العملية متوفرة.

على سبيل المثال ، يعد MemoryStream مجرد طريقة لنقل وحدات البايت إلى جزء كبير من الذاكرة. ومن ثم يمكنك الاتصال على القراءة والكتابة عليها.

من ناحية أخرى ، يتيح لك FileStream القراءة أو الكتابة (أو كليهما) من / إلى ملف. تعتمد إمكانية القراءة أو الكتابة على كيفية فتح الملف. لا يمكنك الكتابة إلى ملف إذا قمت بفتحه فقط للوصول للقراءة.


حسنًا ، يمكنك القراءة والكتابة على دفق في معظم الحالات ، فذاكرة الذاكرة هي شيء يمكنك التصريح به بحيث يمكنك العمل مع البيانات في الذاكرة ويكون دفق الملف عبارة عن دفق يشير إلى ملف حتى عند الكتابة أو القراءة تشكيل تيار ملف ثم تقوم بقراءة / كتابة الملف.


فقط ألقيها:

MyEnum e = (MyEnum)3;

يمكنك التحقق مما إذا كان في النطاق باستخدام Enum.IsDefined :

if (Enum.IsDefined(typeof(MyEnum), 3)) { ... }






c# stream