উত্তর:
একটি স্ট্রিম অবজেক্টের সিক্যুয়েন্সকে প্রতিনিধিত্ব করে (সাধারণত বাইট, তবে তা অগত্যা নয়), যা ক্রমিক ক্রমে অ্যাক্সেস করা যায়। একটি স্ট্রিমের সাধারণ ক্রিয়াকলাপ:
একটি নির্দিষ্ট স্ট্রিম পঠন (যে ক্ষেত্রে এটি একটি "ইনপুট স্ট্রিম"), লিখন ("আউটপুট স্ট্রিম") বা উভয়কে সমর্থন করতে পারে। সমস্ত স্ট্রিম সন্ধানযোগ্য নয়।
পিছনে ধাক্কা মোটামুটি বিরল, তবে আপনি সর্বদা একটি অভ্যন্তরীণ বাফার ধারণ করে এমন অন্য ইনপুট স্ট্রিমের মধ্যে আসল ইনপুট স্ট্রিমটি মোড়ক করে একটি স্ট্রিমে এটি যুক্ত করতে পারেন। বাফার থেকে পঠনগুলি আসে এবং আপনি যদি পিছনে ধাক্কা দেন তবে ডেটা বাফারে রাখা হয়। যদি বাফারে কিছুই না থাকে তবে পুশ ব্যাক স্ট্রিমটি আসল স্ট্রিম থেকে পড়ে। এটি একটি "স্ট্রিম অ্যাডাপ্টার" এর একটি সাধারণ উদাহরণ: এটি একটি ইনপুট স্ট্রিমের "শেষ" এ বসে এটি নিজেই একটি ইনপুট স্ট্রিম এবং এটি অতিরিক্ত কিছু করে যা মূল স্ট্রিমটি করেনি।
স্ট্রিম একটি দরকারী বিমূর্ততা কারণ এটি ফাইলগুলি বর্ণনা করতে পারে (যা প্রকৃতপক্ষে অ্যারেগুলি হয়, তাই অনুসন্ধানগুলি সরল থাকে) তবে টার্মিনাল ইনপুট / আউটপুট (যা বাফার না করে অনুসন্ধানযোগ্য নয়), সকেট, সিরিয়াল পোর্ট ইত্যাদি So সুতরাং আপনি কোড লিখতে পারেন যা বলে হয় "আমি কিছু ডেটা চাই, এবং কোথা থেকে এসেছে তা এখানে কীভাবে আসে বা এটি এখানে কীভাবে আসে সে সম্পর্কে আমি চিন্তা করি না", বা "আমি কিছু ডেটা তৈরি করব, এবং এটির কী ঘটে তা সম্পূর্ণভাবে আমার কলারের উপর নির্ভর করে"। প্রাক্তন একটি ইনপুট স্ট্রিম প্যারামিটার নেয়, পরে একটি আউটপুট স্ট্রিম প্যারামিটার নেয়।
আমি যে সর্বোত্তম উপমাটি ভাবতে পারি তা হ'ল একটি স্রোত হ'ল একটি বাহক বেল্ট যা আপনার দিকে আসে বা আপনার কাছ থেকে দূরে চলে যায় (বা কখনও কখনও উভয়ই)। আপনি ইনপুট স্ট্রিমটি স্টাফটি সরিয়ে ফেলেন, আপনি আউটপুট স্ট্রিমে স্টাফ রেখেছেন। কিছু পরিবাহক যা আপনি প্রাচীরের কোনও ছিদ্র থেকে বেরিয়ে আসার কথা ভাবতে পারেন - সেগুলি অন্বেষণযোগ্য নয়, পড়া বা লেখা এককালীন চুক্তি। কিছু কনভেয়র আপনার সামনে দাঁড় করানো হয়েছে, এবং আপনি যে স্ট্রিমটি পড়তে / লিখতে চান তার সন্ধানের স্থানটি বেছে নিতে আপনি এগিয়ে যেতে পারেন - এটি সন্ধান করছে।
আইআরবিএম যেমন বলেছে, যদিও কোনও শারীরিক সাদৃশ্য না করে এটি যে অপারেশনগুলি সরবরাহ করে (যা বাস্তবায়নের পরিবর্তে পরিবর্তিত হয়, তবে অনেকগুলি মিল রয়েছে) তার দিক থেকে একটি স্ট্রিমের কথা ভাবা ভাল। স্ট্রিমগুলি হ'ল "আপনি পড়তে বা লিখতে পারেন এমন জিনিস"। আপনি যখন স্ট্রিম অ্যাডাপ্টারগুলি সংযুক্ত করতে শুরু করেন, তখন আপনি সেগুলি একটি বাহক এবং একটি পরিবাহক সহ একটি বাক্স হিসাবে ভাবতে পারেন যে আপনি অন্যান্য স্ট্রিমের সাথে সংযুক্ত হন এবং তারপরে বাক্সটি ডেটাতে কিছু রূপান্তর সম্পাদন করে (এটি জিপ করে, বা ইউনিক্স লাইনফিডগুলি পরিবর্তন করে) ডস বেশী, বা যাই হোক না কেন)। পাইপগুলি রূপকের আরেকটি পুঙ্খানুপুঙ্খ পরীক্ষা: আপনি যেখানে স্ট্রিমগুলির একটি জুড়ি তৈরি করেন যাতে আপনি যা লিখেন তা অন্যটির থেকে পড়তে পারে। ওয়ার্মহোলগুলি ভাবুন :-)
একটি স্রোত ইতিমধ্যে রূপক, একটি উপমা, তাই অন্য কোনও পোভাইড করার দরকার নেই। আপনি এটির মূলত পানির প্রবাহের পাইপ হিসাবে এটি ভাবতে পারেন যেখানে জলটি আসলে ডেটা এবং পাইপটি প্রবাহ stream আমি ধারনা করি যদি এটি স্ট্রিম দ্বি-দিকনির্দেশক হয় তবে এটি 2 ধরণের পাইপ জাতীয়। এটি মূলত একটি সাধারণ বিমূর্ততা যা এমন জিনিসের উপরে স্থাপন করা হয় যেখানে এক বা উভয় দিকের ডেটার প্রবাহ বা ক্রম থাকে।
সি #, ভিবি.নেট, সি ++, জাভা ইত্যাদির মতো ভাষায়, স্ট্রিম রূপকটি অনেক কিছুর জন্য ব্যবহৃত হয়। ফাইল স্ট্রিম রয়েছে, যার মধ্যে আপনি একটি ফাইল খোলেন এবং স্ট্রিম থেকে পড়তে বা এটিকে অবিরত লিখতে পারেন; এমন নেটওয়ার্ক স্ট্রিম রয়েছে যেখানে স্ট্রিম থেকে পড়া এবং লিখনটি অন্তর্নিহিত প্রতিষ্ঠিত নেটওয়ার্ক সংযোগে পাঠায় এবং লিখে writes শুধুমাত্র লেখার জন্য স্ট্রিমগুলিকে সাধারণত আউটপুট স্ট্রিমগুলি বলা হয়, যেমন এই উদাহরণে এবং একইভাবে, কেবলমাত্র পড়ার জন্য স্ট্রিমগুলি ইনপুট স্ট্রিম বলে, যেমন এই উদাহরণ হিসাবে ।
একটি স্ট্রীম রূপান্তর বা ডাটা এনকোডিং (একটি সম্পাদন করতে পারবেন SslStream নেট মধ্যে, উদাহরণস্বরূপ, SSL এর আপস ডেটা খাওয়া এবং আপনার কাছ থেকে গোপন করবে; একজন TelnetStream আপনার কাছ থেকে টেলনেট আলোচনার লুকাতে পারে, কিন্তু ডেটাতে অ্যাক্সেস প্রদান করে; একজন জাভাতে জিপআউটপুট স্ট্রিম আপনাকে জিপ ফাইল ফর্ম্যাটটির ইন্টার্নালগুলি নিয়ে চিন্তা না করেই একটি জিপ সংরক্ষণাগারে ফাইলগুলিতে লেখার অনুমতি দেয়।
আপনি যে সাধারণ জিনিস খুঁজে পেতে পারেন সেটি হ'ল পাঠ্য স্ট্রিমগুলি যা আপনাকে বাইটের পরিবর্তে স্ট্রিং লিখতে দেয় বা কিছু ভাষা বাইনারি স্ট্রিম সরবরাহ করে যা আপনাকে আদিম ধরণের লেখার অনুমতি দেয়। একটি সাধারণ জিনিস যা আপনি পাঠ্য স্রোতে খুঁজে পাবেন তা হ'ল একটি অক্ষর এনকোডিং, যা সম্পর্কে আপনার সচেতন হওয়া উচিত।
কিছু স্ট্রিম এছাড়াও এলোমেলো অ্যাক্সেস সমর্থন করে, যেমন এই উদাহরণ হিসাবে । অন্যদিকে, একটি নেটওয়ার্ক স্ট্রিম সুস্পষ্ট কারণে, তা করবে না।
অপারেটিং সিস্টেমগুলির মতো ইউনিক্সও এখানে বর্ণিত হিসাবে প্রোগ্রাম ইনপুট এবং আউটপুট সহ স্ট্রিম মডেলটিকে সমর্থন করে ।
এখনও পর্যন্ত দেওয়া উত্তরগুলি দুর্দান্ত। আমি কেবল অন্যটি হাইলাইট করার জন্য সরবরাহ করছি যে স্ট্রিমটি বাইটের ক্রম নয় বা কোনও প্রোগ্রামিং ভাষার সাথে নির্দিষ্ট নয় কারণ ধারণাটি সর্বজনীন (যদিও এর প্রয়োগটি অনন্য হতে পারে)। আমি প্রায়শই এসকিউএল, বা সি বা জাভা হিসাবে বিবেচনা করে অনলাইনে প্রচুর ব্যাখ্যা দেখতে পাই যা মেমরির অবস্থান এবং নিম্ন স্তরের ক্রিয়াকলাপগুলিকে ফাইলধারার হিসাবে বিবেচনা করে। তবে তারা প্রায়শই একটি প্রবাহের ধারণাটি আলোচনার পরিবর্তে কীভাবে একটি ফাইল স্ট্রিম তৈরি করবেন এবং তাদের প্রদত্ত ভাষায় সম্ভাব্য ফাইলটিতে কীভাবে পরিচালনা করবেন তা সম্বোধন করে।
যেমনটি উল্লেখ করা হয়েছে stream
হ'ল রূপক, আরও জটিল কোনও কিছুর বিমূর্ততা। আপনার কল্পনাশক্তি কাজ করতে আমি অন্য কিছু রূপক অফার:
পায়ের পাতার মোজাবিশেষ জল ধারা
আপনার ট্যাঙ্কে গ্যাস প্রবাহিত করার জন্য পায়ের পাতার মোজাবিশেষ, অগ্রভাগ এবং সম্পর্কিত পদ্ধতি হ'ল প্রবাহ
ফ্রিওয়ে হ'ল স্রোত
আপনার কান এবং চোখ প্রবাহিত হয়
আশা করি আপনি এই উদাহরণগুলিতে লক্ষ্য করেছেন যে স্ট্রিম রূপকগুলি কেবলমাত্র কিছুটিকে (বা এটি ফ্রিওয়ের ক্ষেত্রে) যাতায়াত করার অনুমতি দেওয়ার জন্য বিদ্যমান এবং তারা যে স্থানান্তরিত করছে তা সবসময় নিজেরাই পোষণ করে না। একটি গুরুত্বপূর্ণ পার্থক্য। আমরা শব্দের অনুক্রম হিসাবে আমাদের কানকে উল্লেখ করি না। একটি পায়ের পাতার মোজাবিশেষ এখনও একটি পায়ের পাতার মোজাবিশেষ যদি কোনও জল এটির মধ্য দিয়ে প্রবাহিত না হয় তবে এটি সঠিকভাবে কাজ করার জন্য আমাদের এটি একটি স্পিগোটের সাথে সংযুক্ত করতে হবে। একটি গাড়ি কেবলমাত্র 'ধরণের' যানবাহন নয় যা কোনও ফ্রিওয়ে পেরিয়ে যেতে পারে।
এভাবে একটি স্ট্রিম বিদ্যমান পারেন যতদিন এটা করা হয় এটা মাধ্যমে ভ্রমণ কোন তথ্য আছে যা সংযুক্ত একটি থেকে ফাইল ।
এর পরে, আমাদের কয়েকটি প্রশ্নের উত্তর দেওয়া দরকার। আমি স্ট্রিমগুলি বর্ণনা করতে ফাইলগুলি ব্যবহার করতে যাচ্ছি ... একটি ফাইল কী? এবং আমরা কীভাবে একটি ফাইল পড়ব? অপ্রয়োজনীয় জটিলতা এড়াতে আমি বিমূর্ততার একটি নির্দিষ্ট স্তর বজায় রেখে এর জবাব দেওয়ার চেষ্টা করব এবং একটি সরলতা এবং অ্যাক্সেসযোগ্যতার কারণে একটি লিনাক্স অপারেটিং সিস্টেমের সাথে সম্পর্কিত একটি ফাইলের ধারণাটি ব্যবহার করব।
একটি ফাইল একটি বিমূর্ততা :)
অথবা, আমি যেমন ব্যাখ্যা করতে পারি ঠিক তেমনি একটি ফাইল হ'ল একটি অংশের তথ্য কাঠামো যা ফাইলটিকে বর্ণনা করে এবং একটি অংশের ডেটা যা আসল সামগ্রী।
ডেটা স্ট্রাকচার অংশটি (ইউএনআইএক্স / লিনাক্স সিস্টেমে একটি আইনোড নামে পরিচিত) বিষয়বস্তু সম্পর্কে তথ্যের গুরুত্বপূর্ণ অংশগুলি সনাক্ত করে, তবে এতে সামগ্রী নিজেই অন্তর্ভুক্ত হয় না (বা বিষয়টির জন্য ফাইলের একটি নাম)। তথ্য রাখার এক টুকরোটি হ'ল লিখিত সামগ্রীটি শুরু হয় সেখানে মেমরি ঠিকানা। সুতরাং একটি ফাইলের নাম (বা লিনাক্সের একটি হার্ড লিঙ্ক) সহ, একটি ফাইল বর্ণনাকারী (অপারেটিং সিস্টেমটি যত্নশীল এমন একটি সংখ্যক ফাইলের নাম) এবং মেমরির একটি শুরুর অবস্থানের সাথে আমাদের এমন কিছু রয়েছে যা আমরা একটি ফাইল কল করতে পারি।
(মূল অবলম্বন একটি 'ফাইল' অপারেটিং সিস্টেম দ্বারা সংজ্ঞায়িত করা হয় কারণ এটি ওএস হ'ল শেষ পর্যন্ত এর সাথে মোকাবিলা করতে হবে and এবং হ্যাঁ, ফাইলগুলি আরও জটিল)
এ পর্যন্ত সব ঠিকই. তবে আমরা কীভাবে ফাইলটির বিষয়বস্তু পেতে পারি, আপনার বিউকে একটি প্রেমপত্র বলি, যাতে আমরা এটি মুদ্রণ করতে পারি?
যদি আমরা ফলাফলটি থেকে শুরু করে পিছনে সরে যাই, আমরা যখন আমাদের কম্পিউটারে একটি ফাইল খুলি তখন তার সম্পূর্ণ বিষয়বস্তু আমাদের পড়ার জন্য আমাদের স্ক্রিনে স্প্ল্যাশ করা হয়। কিন্তু কিভাবে? খুব পদ্ধতিগতভাবে উত্তর। ফাইলের বিষয়বস্তু নিজেই অন্য একটি ডেটা কাঠামো। ধরুন একটি অ্যারের অক্ষর। আমরা এটিকে স্ট্রিং হিসাবেও ভাবতে পারি।
সুতরাং কিভাবে আমরা এই স্ট্রিং 'পড়া'? স্মৃতিতে এর অবস্থানটি সন্ধান করে এবং আমাদের অক্ষরের অ্যারে দিয়ে পুনরাবৃত্তি করে একবারে একটি অক্ষর ফাইলের অক্ষরের শেষ না হওয়া পর্যন্ত। অন্য কথায় একটি প্রোগ্রাম।
একটি স্ট্রিম 'তৈরি করা হয়' যখন এটির প্রোগ্রামটি কল করা হয় এবং এতে সংযুক্ত বা সংযুক্ত হওয়ার জন্য এর একটি মেমরি অবস্থান থাকে । অনেকটা আমাদের পানির পায়ের পাতার মোজাবিশেষ উদাহরণের মতো, পায়ের পাতার মোজাবিশেষটি যদি স্পিগোটের সাথে সংযুক্ত না থাকে তবে তা অকার্যকর। স্ট্রিমের ক্ষেত্রে এটি বিদ্যমান থাকার জন্য এটি অবশ্যই একটি ফাইলের সাথে সংযুক্ত থাকতে হবে।
স্ট্রিমগুলি আরও পরিমার্জন করা যায়, উদাহরণস্বরূপ, ইনপুট পাওয়ার জন্য একটি স্ট্রিম বা স্ট্যান্ডার্ড আউটপুটে কোনও ফাইল সামগ্রী পাঠানোর জন্য একটি স্ট্রিম। ইউএনআইএক্স / লিনাক্স আমাদের জন্য সরাসরি ব্যাট, স্টিডিন (স্ট্যান্ডার্ড ইনপুট), স্টডআউট (স্ট্যান্ডার্ড আউটপুট) এবং স্টার্ডার (স্ট্যান্ডার্ড ত্রুটি) বন্ধ করে 3 ফাইল স্ট্রিমগুলি সংযুক্ত করে এবং খোলা রাখে। স্ট্রিমগুলি নিজেরাই বা কাঠামো হিসাবে ডেটা স্ট্রাকচার হিসাবে তৈরি করা যেতে পারে যা সেগুলির মাধ্যমে আমাদের স্ট্রিমিং ডেটা আরও জটিল ক্রিয়াকলাপ সম্পাদন করতে দেয় যেমন স্ট্রিমটি খোলার, স্ট্রিমটি বন্ধ করা বা ফাইলটি পরীক্ষা করার ক্ষেত্রে ত্রুটি কোনও স্ট্রিমের সাথে সংযুক্ত রয়েছে। সি ++ এর cin
স্ট্রিম অবজেক্টের উদাহরণ।
অবশ্যই, আপনি যদি এটি চয়ন করেন তবে আপনি নিজের স্ট্রিম লিখতে পারেন।
একটি স্ট্রিম কোডের একটি পুনরায় ব্যবহারযোগ্য টুকরা যা ডেটাতে কার্য সম্পাদন করার জন্য দরকারী ক্রিয়াকলাপ সরবরাহ করার সময় ডেটা নিয়ে কাজ করার জটিলতার বিমূর্ত করে।
আরেকটি উপমা: আপনি কোনও স্রোতের বিপরীতে সাঁতার কাটতে পারবেন না, এ কারণেই স্রোত থেকে আপনি পরবর্তী বিট, বাইট, স্ট্রিং বা অবজেক্টটি নিতে পারবেন, ইতিমধ্যে পঠিত ডেটা মুছে ফেলা হয়েছে। একটি একমুখী টিকিট ... বা মূলত অধ্যবসায় না সঞ্চয় করে কেবল একটি সারি ।
তাহলে আমাদের কি সারিতে দরকার? তুমি ঠিক কর.
"স্ট্রিম" শব্দটি বেছে নেওয়া হয়েছে কারণ এটি (বাস্তব জীবনে) প্রতিনিধিত্ব করে আমরা যখন এটি ব্যবহার করি তখন আমরা যা জানাতে চাই তার একটি খুব মিল meaning
জলের স্রোতের সাথে সাদৃশ্য সম্পর্কে চিন্তাভাবনা শুরু করুন। আপনি যেমন নদীর মধ্যে অবিচ্ছিন্নভাবে জল প্রবাহিত করেন ঠিক তেমনই আপনি অবিচ্ছিন্নভাবে ডেটা প্রবাহ পান। কোথা থেকে ডেটা আসছে তা আপনি অগত্যা জানেন না এবং প্রায়শই আপনার প্রয়োজন হয় না; এটি কোনও ফাইল, সকেট বা অন্য যে কোনও উত্স থেকে আসুক না কেন, এটি সত্যই গুরুত্বপূর্ণ (হওয়া উচিত নয়) doesn't এটি জলের স্রোত গ্রহণের সাথে সাদৃশ্য, যার মাধ্যমে এটি কোথায় থেকে আসছে তা আপনার জানা দরকার নেই; এটি হ্রদ, ঝর্ণা বা অন্য যে কোনও উত্স থেকে আসুক না কেন, এটি সত্যই গুরুত্বপূর্ণ (হওয়া উচিত নয়) doesn't উৎস