ফাইল ইনপুট/আউটপুট বা I/O (File I/O)
ফাইল কেন এত গুরুত্বপূর্ণ? (Why Files Matter)
যখনই আপনার প্রোগ্রামটি শেষ হয়ে যায় বা বন্ধ হয়, তখন এর ভেরিয়েবলগুলো (variables) মুছে যায় — কারণ এগুলো র্যামের (RAM) মধ্যে থাকে, যা প্রোগ্রাম বন্ধ হওয়ার সাথে সাথেই পরিষ্কার হয়ে যায়। কিন্তু ফাইল হলো আপনার প্রোগ্রামের দীর্ঘমেয়াদী স্মৃতি (long-term memory)। ফাইলের সাহায্যে আপনি হার্ডডিস্কে ডেটা সেভ করে রাখতে পারবেন, যার ফলে প্রোগ্রাম রিস্টার্ট (restart) দিলে, ক্র্যাশ (crash) করলে, এমনকি বিদ্যুৎ চলে গেলেও আপনার ডেটা হারাবে না।
সি শার্পে (C#) ফাইল নিয়ে কাজ করাটা আশ্চর্যজনক রকম সহজ। সাধারণ কাজগুলো করার জন্য File ক্লাসে খুব সহজ কিছু এক লাইনের (one-liner) মেথড রয়েছে, আবার বড় ফাইলগুলোর জন্য রয়েছে StreamReader বা StreamWriter, যার মাধ্যমে পুরো ফাইলের ওপর আপনার দারুণ নিয়ন্ত্রণ থাকে।
ফাইল নিয়ে সব ধরনের কাজই System.IO নামের একটি নেমস্পেসের (namespace) ভেতরে থাকে (যা টপ-লেভেল স্টেটমেন্টস বা top-level statements-এ আগে থেকেই ডিফল্টভাবে যুক্ত করা থাকে)।
File ক্লাসের সাহায্যে খুব দ্রুত ফাইলের কাজগুলো করে ফেলা (Quick File Operations with the File Class)
StreamReader এবং StreamWriter — বড় ফাইলগুলোর জন্য (StreamReader & StreamWriter — For Bigger Files)
File.ReadAllText() মেথডটি পুরো ফাইলটিকে একবারেই পড়ে মেমোরিতে (memory) নিয়ে আসে। ছোট ফাইলগুলোর জন্য এটি একদম ঠিক আছে, কিন্তু আপনার ফাইলটি যদি ২ গিগাবাইট (2 GB) সাইজের হয়, তখন কী হবে? এটি আপনার কম্পিউটারের পুরো র্যাম (RAM) খেয়ে ফেলবে এবং আপনার অ্যাপটি ক্র্যাশ (crash) করবে।
এ ক্ষেত্রে বালতির (bucket) বদলে StreamReader এবং StreamWriter অনেকটা বাগানে পানি দেওয়ার পাইপের (garden hose) মতো কাজ করে। একবারে বালতি ভর্তি করে সব পানি (বা ডেটা) না ঢেলে, এগুলো একটি পাইপ বা স্ট্রিমের (stream) ভেতর দিয়ে একে একে পানি প্রবাহিত করে। এর ফলে মেমোরি অনেক বেঁচে যায়।
এখানে using স্টেটমেন্টটি খুবই গুরুত্বপূর্ণ — কারণ কাজ শেষ হয়ে গেলে এটি নিজে থেকেই ফাইলটিকে বন্ধ করে দেয়, এমনকি কোনো এক্সেপশন বা এরর (error) হলেও। একে একটি ছোট্ট চিরকুট হিসেবে ভাবতে পারেন, যাতে লেখা আছে "আপনার কাজ শেষ হয়ে গেলে, দয়া করে জিনিসটি আবার তার জায়গায় রেখে দিন।"
StreamReader, StreamWriter এবং using (StreamReader, StreamWriter & using)
অ্যাসিংক ফাইল I/O — আপনার অ্যাপকে আটকে বা ফ্রিজ হতে দেবেন না (Async File I/O — Don't Freeze Your App)
ফাইল সংক্রান্ত কাজগুলো একটু ধীরগতির (slow) হতে পারে — বিশেষ করে পুরোনো হার্ড ড্রাইভ (hard drives) বা নেটওয়ার্কের (networks) ওপর কাজ করার সময়। আপনি যদি মেইন থ্রেডে (main thread) বসে একটি বিশাল ফাইল পড়তে যান, তবে ফাইলের কাজ শেষ হওয়ার জন্য অপেক্ষা করতে করতে আপনার অ্যাপটি একেবারে আটকে বা ফ্রিজ (freezes) হয়ে যাবে। আর কেউই এমন আটকে থাকা বা কাজ না করা অ্যাপ ব্যবহার করতে চায় না।
অ্যাসিংক (Async) মেথডগুলো (যেগুলোতে async/await ব্যবহার করা হয়) ফাইল পড়ার সময়ও আপনার প্রোগ্রামকে অন্যান্য কাজ করার সুযোগ দেয়। File ক্লাসের প্রতিটি মেথডেরই অ্যাসিংক বা Async ভার্সন রয়েছে — এগুলোর জন্য শুধু মেথডের নামের শেষে Async শব্দটি যুক্ত করে দিতে হয় এবং কল (call) করার সময় সামনে await লিখে দিতে হয়।