سؤال
التدفقات غامضة نوعًا ما بالنسبة لي.لا أعرف متى أستخدم أي تيار وكيفية استخدامه.هل يمكن لأحد أن يشرح لي كيف يتم استخدام التدفقات؟
إذا فهمت بشكل صحيح، هناك ثلاثة أنواع من التدفق:
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 البيانات من الشبكة وما إلى ذلك.