সি # স্ট্রিম ব্যবহার করে


116

স্ট্রিমগুলি আমার কাছে এক ধরণের রহস্যময়। কখন কোন স্ট্রিমটি ব্যবহার করব এবং কীভাবে সেগুলি ব্যবহার করব তা আমি জানি না। কেউ কী আমাকে স্ট্রিম ব্যবহার করা যায় তা ব্যাখ্যা করতে পারেন?

আমি যদি সঠিকভাবে বুঝতে পারি তবে তিনটি প্রবাহের ধরণ রয়েছে:

  • stream
  • read stream
  • write stream

এটা কি সঠিক? এবং, উদাহরণস্বরূপ, a Memorystreamএবং a এর মধ্যে পার্থক্য কী FileStream?


13
আপনি চেক করতে পারেন stackoverflow.com/questions/507747/...
Preets

3
বাইটের একটি অ্যারে নিন এবং তারপরে একটি মোড়ক তৈরি করুন ( Stream) যা পড়া, লেখার এবং অবস্থান পরিবর্তন করার মতো কিছু সহায়ক পদ্ধতি প্রকাশ করে। এখন আপনি তাদের ব্যাকিং স্টোরের ভিত্তিতে ক্লাস তৈরি করতে পারেন (ফাইলস্ট্রিম, মেমরিস্ট্রিম) যা উত্তরাধিকার সূত্রে প্রাপ্ত Streamএবং নির্দিষ্ট ব্যাকিং স্টোরের ভিত্তিতে সেই কার্যকারিতাটি তৈরি করতে পারে build
মাফিন ম্যান

উত্তর:


80

একটি স্ট্রিম একটি স্থান যা ডেটা স্থানান্তর করতে ব্যবহৃত হয়। জেনেরিক স্ট্রিম শ্রেণি রয়েছে System.IO.Stream, সেখান থেকে .NET এ থাকা সমস্ত স্ট্রিম ক্লাস উত্পন্ন হয়। Streamবর্গ বাইট নিয়ে কাজ করে।

কংক্রিট স্ট্রিম ক্লাসগুলি বাইটের চেয়ে অন্যান্য ধরণের ডেটা নিয়ে কাজ করার জন্য ব্যবহৃত হয়। উদাহরণ স্বরূপ:

  • FileStreamশ্রেণী যখন বাইরের উত্স একটি ফাইল ব্যবহার করা হয়
  • MemoryStream মেমরিতে ডেটা সঞ্চয় করতে ব্যবহৃত হয়
  • System.Net.Sockets.NetworkStream নেটওয়ার্ক ডেটা পরিচালনা করে

রিডার / লেখক যেমন স্ট্রীম করে StreamReaderএবং StreamWriterস্ট্রীম করে নেই - তারা উদ্ভূত নেই থেকে System.IO.Stream, তারা লিখতে সাহায্য করার জন্য ডিজাইন থেকে এবং প্রবাহে ডেটা পড়তে হয়!


3
সুতরাং, যদি আমি সঠিকভাবে বুঝতে পারি তবে স্ট্রিমটিতে ডেটা রয়েছে এবং এটি দিয়ে কিছুই করে না। পাঠক এবং লেখক 'সহায়ক' শ্রেণিগুলি প্রবাহের মধ্যে থাকা ডেটাগুলি পরিচালনা করতে (পরিচালনা করতে পারে)?
মার্টিজন

9
না, স্ট্রিম ডেটা ধারক নয়, এটি ডেটা স্থানান্তর করতে ব্যবহার করছে, উদাহরণস্বরূপ ফাইলস্ট্রিম ডেটা বাইট [] থেকে ফিজিক্যাল ফাইলে স্থানান্তর করে, নেটওয়ার্ক স্ট্রিম বাইট [] সকেট দ্বারা স্থানান্তর করে। পাঠক লেখক ক্লাসগুলি স্ট্রিম থেকে লেখার এবং পড়ার জন্য সহায়ক শ্রেণি, উদাহরণস্বরূপ স্ট্রিমরেডার বাইট নয় স্ট্রিম স্ট্রিং থেকে পড়তে ব্যবহার করা যেতে পারে] যদি আপনি প্যারামিটার হিসাবে ফাইল স্ট্রিমটি দেন তবে এটি ফাইল থেকে পড়া হবে, যদি সকেট থেকে নেটওয়ার্ক স্ট্রিম।
আর্সেন এমক্র্টচায়ান

তদ্ব্যতীত, স্ট্রিমরিডার এবং স্ট্রিম রাইটারগুলি পাঠ্য এবং পাঠ্য পাঠ্য লেখার জন্য রয়েছে (অক্ষর) স্ট্রিম।
1c1cle

1
মেমোরিস্ট্রিমটি বুঝতে আপনাকে সহায়তা করার জন্য একটি ভাল নিবন্ধ রয়েছে। কোডেপ্রজেক্ট
লি

2
@ user420667। ভাল প্রশ্ন. অডিওস্ট্রিম এবং টেম্পারেচার স্ট্রিম উভয় ক্ষেত্রেই সম্ভবত তারা ডিভাইসের সাথে সম্পর্কিত ড্রাইভারের কাছে বাইনারিস্ট্রিম হতে পারে। অথবা, আপনি একটি কাস্টমস্ট্রিম তৈরি করতে পারেন যা ইন্টারফেসের জন্য বিশেষভাবে নির্মিত।
1c1cle

62

এখানে অন্যান্য উত্তরের বিষয়ে কিছুটা প্রসারিত করতে এবং উদাহরণস্বরূপ কোড সম্পর্কে আপনি যা ডটেড দেখতে পাবেন তার বেশিরভাগ সময় ব্যাখ্যা করতে সহায়তা করুন, বেশিরভাগ সময় আপনি সরাসরি কোনও স্ট্রিমে পড়েন না এবং লিখেন না। স্ট্রিমগুলি ডেটা স্থানান্তর করার জন্য একটি নিম্ন-স্তরের মাধ্যম।

আপনি লক্ষ্য করবেন যে পড়তে এবং লেখার জন্য সমস্ত কার্যগুলি বাইট ভিত্তিক হয়, যেমন: WritByte ()। পূর্ণসংখ্যা, স্ট্রিং ইত্যাদি নিয়ে কাজ করার জন্য কোনও কার্যকারিতা নেই এটি স্ট্রিমটিকে খুব সাধারণ-উদ্দেশ্য করে তোলে, তবে যদি বলি আপনি কেবল পাঠ্য স্থানান্তর করতে চান তবে এর সাথে কাজ করা কম সহজ work

তবে .NET ক্লাস সরবরাহ করে যা দেশীয় প্রকার এবং নিম্ন-স্তরের স্ট্রিম ইন্টারফেসের মধ্যে রূপান্তর করে এবং আপনার জন্য স্ট্রিমে বা থেকে ডেটা স্থানান্তর করে fers এর মধ্যে কয়েকটি উল্লেখযোগ্য শ্রেণি:

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

এগুলি ব্যবহার করতে, প্রথমে আপনি আপনার স্ট্রিমটি অর্জন করুন, তারপরে আপনি উপরের শ্রেণীর একটি তৈরি করুন এবং এটিকে প্রবাহের সাথে যুক্ত করুন। যেমন

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

স্ট্রিমরিডার এবং স্ট্রিম রাইটার দেশীয় ধরণের এবং তাদের স্ট্রিং উপস্থাপনার মধ্যে রূপান্তর করে তারপরে স্ট্রিংগুলিকে স্ট্রিম থেকে বাইট হিসাবে স্থানান্তর করে। সুতরাং

myStreamWriter.Write(123);

"123" (তিনটি অক্ষর '1', '2' তারপরে '3') প্রবাহে লিখবে। আপনি যদি পাঠ্য ফাইলগুলি (যেমন এইচটিএমএল) নিয়ে কাজ করছেন তবে স্ট্রিমরাইডার এবং স্ট্রিম রাইটারগুলি আপনার ব্যবহৃত ক্লাস।

যেহেতু

myBinaryWriter.Write(123);

32-বিট পূর্ণসংখ্যার মান 123 (0x7B, 0x00, 0x00, 0x00) উপস্থাপন করে চারটি বাইট লিখবে। আপনি যদি বাইনারি ফাইল বা নেটওয়ার্ক প্রোটোকল নিয়ে কাজ করছেন তবে বাইনারিআডার এবং বাইনারিউইটার যা আপনি ব্যবহার করতে পারেন। (আপনি যদি নেটওয়ার্কগুলি বা অন্যান্য সিস্টেমের সাথে ডেটা বিনিময় করেন তবে আপনাকে অন্তর্নিহিততার বিষয়ে সচেতন হওয়া দরকার , তবে এটি অন্য একটি পোস্ট))


স্ট্রাইমাইটার এবং রিডার অ্যাডাপ্টার ক্লাসগুলির গুরুতরভাবে খারাপ নাম দেওয়া হয়েছে। যে উল্লেখ করার জন্য ধন্যবাদ। তারা কীভাবে এই নামটি নিয়ে এসেছিল তা এখনও আমার কাছে অবাক করে।
তারিক

এছাড়াও, এমনকি বাইনারি লেখক এবং পাঠক ক্লাসগুলি খারাপ নাম দেওয়া হয়েছে।
তারিক

22

স্ট্রিমগুলি প্রচুর পরিমাণে ডেটা ব্যবহারের জন্য ভাল। যখন একই সাথে সমস্ত ডেটা মেমোরিতে লোড করা অযৌক্তিক হয়, আপনি এটিকে স্ট্রিম হিসাবে খুলতে এবং এর ছোট অংশগুলির সাথে কাজ করতে পারেন।


1
আপনি সবেমাত্র যা বলেছেন "এর ছোট অংশ নিয়ে কাজ করুন" তার একটি উদাহরণ দেখতে পছন্দ করবেন।
জেনা লিফ

2
স্ট্রিমগুলি খুব অল্প পরিমাণে ডেটার জন্যও ভাল। যদি কোনও সি # প্রোগ্রামার কোনও ফাইলের বিষয়বস্তুগুলি পরিচালনা করতে চান তবে তাকে অবশ্যই তথ্যের পরিমাণ নির্বিশেষে স্ট্রিমগুলি ব্যবহার করতে হবে। একই স্টেটমেন্টটি নেটওয়ার্ক স্ট্রিমের ক্ষেত্রেও সত্য। মঞ্জুরিপ্রাপ্ত, যদি প্রোগ্রামার কোডিং হয় তবে সি এর মতো নিম্ন স্তরের ভাষা হয় তবে সরাসরি একটি ডিস্ক বা সকেটে অক্ষর বা বাইটগুলি লেখা সম্ভব হয়, তবে এমনকি অল্প পরিমাণে ডেটার জন্য এটি সময়সাপেক্ষ এবং আরও ঝুঁকিপূর্ণ ত্রুটি.
1c1cle

10

স্ট্রিমটি physicalবাইটের স্ট্রিমের উপরে কেবল একটি বিমূর্ততা (বা একটি মোড়ক) । এই physicalপ্রবাহকে বলা হয় base stream। সুতরাং সর্বদা একটি বেস স্ট্রিম থাকে যার উপরে একটি স্ট্রিম র‌্যাপার তৈরি হয় এবং এইভাবে মোড়কের নামকরণ করা হয় বেস স্ট্রিম ধরণের অর্থাত্ FileStream, MemoryStreamইত্যাদি after

স্ট্রিম মোড়কের সুবিধা হ'ল আপনি কোনও অন্তর্নিহিত প্রকারের স্ট্রিমের সাথে ইন্ট্যারাক্ট করার জন্য একটি ইউনিফাইড এপিআই পাবেন usb, fileetc.

আপনি কেন ডেটাটিকে স্ট্রিম হিসাবে বিবেচনা করবেন - যেহেতু ডেটা অংশগুলি চাহিদা অনুযায়ী লোড করা হয়েছে, তাই আমরা সম্পূর্ণ ডেটা মেমরিতে লোড না করে তথ্যটিকে খাঁটি হিসাবে পরিদর্শন / প্রক্রিয়া করতে পারি। প্রোগ্রামগুলির বেশিরভাগই এটি বড় ফাইলগুলির সাথে লেনদেন করে, যেমন একটি ওএস চিত্র ফাইল এনক্রিপ্ট করা।


4

একমাত্র প্রাথমিক ধরণের আছে Stream। তবে বিভিন্ন পরিস্থিতিতে কিছু সদস্যকে ফোন করা হলে একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে কারণ সেই প্রসঙ্গে অপারেশনটি উপলভ্য ছিল না।

উদাহরণস্বরূপ, একটি MemoryStreamসহজভাবে বাইটগুলিকে মেমরির একদম ভিতরে outোকানো এবং আউট করার একটি উপায়। সুতরাং আপনি এটি পড়ুন এবং লিখতে কল করতে পারেন।

অন্যদিকে একটি FileStreamআপনাকে ফাইল থেকে / অথবা (বা উভয়) পড়তে বা লিখতে দেয়। আপনি আসলে পড়তে বা লিখতে পারেন কিনা তা ফাইল কীভাবে খোলা হয়েছিল তার উপর নির্ভর করে। আপনি যদি কেবল কোনও ফাইলের পড়ার অ্যাক্সেসের জন্য খোলা থাকেন তবে আপনি কোনও ফাইলটিতে লিখতে পারবেন না।


3

আমি এমএসডিএন-তে স্ট্রিমগুলি পড়ে শুরু করব: http://msdn.microsoft.com/en-us/library/system.io.stream.aspx

মেমরিস্ট্রিম এবং ফাইল স্ট্রিম হ'ল স্ট্রিমগুলি যথাক্রমে কাঁচা মেমরি এবং ফাইলগুলির সাথে কাজ করতে ব্যবহৃত হয় ...


লিঙ্কের জন্য ধন্যবাদ। আমি পছন্দ করেছিলাম যে "আপনি সোর্স কোডটি অনলাইনে ব্রাউজ করতে পারবেন, অফলাইন দেখার জন্য রেফারেন্সটি ডাউনলোড করতে পারেন এবং ডিবাগিংয়ের সময় উত্সগুলির মাধ্যমে (প্যাচগুলি এবং আপডেটগুলি সহ) পদক্ষেপ নিতে পারেন"। এই বৈশিষ্ট্যটি অন্তর্দৃষ্টির একটি নতুন স্তরের প্রস্তাব দেয়।
ডেভিড

1

আমি এই বিভিন্ন ধরণের স্ট্রিমগুলিকে ডাকব না। স্ট্রিম শ্রেণিতে ক্যানআরড এবং ক্যানরাইট বৈশিষ্ট্য রয়েছে যা আপনাকে জানায় যে নির্দিষ্ট স্ট্রিমটি পড়তে এবং এতে লিখিত থাকতে পারে।

বিভিন্ন স্ট্রিম ক্লাসের মধ্যে প্রধান পার্থক্য (যেমন মেমরিস্ট্রিম বনাম ফাইলস্ট্রিম) হ'ল ব্যাকিং স্টোর - যেখানে ডেটা পড়া হয় বা কোথায় লেখা হয় written এটি নাম থেকে এক ধরণের স্পষ্ট। একটি মেমরিস্ট্রিম কেবল মেমোরিতে ডেটা সঞ্চয় করে, একটি ফাইলস্ট্রিম ডিস্কের একটি ফাইল দ্বারা ব্যাক করা হয়, একটি নেটওয়ার্ক স্ট্রিম নেটওয়ার্ক থেকে ডেটা এবং আরও কিছু পড়ে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.