سؤال

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

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

  • stream
  • read stream
  • write stream

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

هل كانت مفيدة؟

المحلول

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

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

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

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

نصائح أخرى

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

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

ومع ذلك، يوفر .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 إلخ.

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

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

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

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

سأبدأ بقراءة التدفقات على MSDN:http://msdn.microsoft.com/en-us/library/system.io.stream.aspx

يعد Memorystream وFileStream عبارة عن تدفقات تستخدم للعمل مع الذاكرة الأولية والملفات على التوالي...

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top